SQL 查询在输出中显示一次重复的行

SQL Query to display a repeated row once in the output

我写了这个查询:

select 
    person_number ,
    elements,
    batchid,
    co_code
from 
    per_all_people_f papf,
    elements_tab elements,
    batch_tab batch,
    company_det co,
where 
    papf.person_id = company_det.person_id
    and elements.element_id = company_det.element_id
    and batch.batchid = co.batchid

union all

select 
    person_number ,
    elements.absence_name elements,
    batchid,
    co_code
from 
    per_all_people_f papf,
    absence_tab elements,
    batch_tab batch,
    company_det co,
where 
    papf.person_id = company_det.person_id
    and elements.absence_id =company_det.absence_id
    and batch.batchid = co.batchid

这 returns 输出如下:

person_number       elements         batchid        co_code
1100928             Benefits        20209181        XYZ
1100928             Benefits        20208361        ARE
1100928             Benefits        92725378        FREELISTS

我可以调整查询以使输出看起来像 -

person_number       elements         batchid        co_code
1100928             Benefits        20209181        XYZ
1100928                             20208361        ARE
1100928                             92725378        FREELISTS

即如果对于 person_number 1100928 元素 Benefits 重复,那么它应该只出现在输出中一次而不是三次

如果您使用的是 SQL*Plus,那么 break 会有所帮助。

例如(因为我没有你的桌子),这是你现在拥有的:

SQL> select d.dname, e.ename, e.job, e.sal
  2  from emp e join dept d on d.deptno = e.deptno
  3  order by d.dname, e.ename;

DNAME          ENAME      JOB              SAL
-------------- ---------- --------- ----------
ACCOUNTING     CLARK      MANAGER         2450
ACCOUNTING     KING       PRESIDENT       5000
ACCOUNTING     MILLER     CLERK           1300
RESEARCH       ADAMS      CLERK           1100
RESEARCH       FORD       ANALYST         3000
RESEARCH       JONES      MANAGER         2975
RESEARCH       SCOTT      ANALYST         3000
RESEARCH       SMITH      CLERK            800
SALES          ALLEN      SALESMAN        1600
SALES          BLAKE      MANAGER         2850
SALES          JAMES      CLERK            950
SALES          MARTIN     SALESMAN        1250
SALES          TURNER     SALESMAN        1500
SALES          WARD       SALESMAN        1250

14 rows selected.

BREAK:

SQL> break on dname
SQL> /

DNAME          ENAME      JOB              SAL
-------------- ---------- --------- ----------
ACCOUNTING     CLARK      MANAGER         2450
               KING       PRESIDENT       5000
               MILLER     CLERK           1300
RESEARCH       ADAMS      CLERK           1100
               FORD       ANALYST         3000
               JONES      MANAGER         2975
               SCOTT      ANALYST         3000
               SMITH      CLERK            800
SALES          ALLEN      SALESMAN        1600
               BLAKE      MANAGER         2850
               JAMES      CLERK            950
               MARTIN     SALESMAN        1250
               TURNER     SALESMAN        1500
               WARD       SALESMAN        1250

14 rows selected.

SQL>

一般来说,这种格式是您使用的报告工具的问题,而不是SQL本身。

P.S。 Jeff Smith 说 break 也适用于 SQL Developer (How to Format Your Script Output in SQL Developer ... By Default),但该文本与版本 4.1 相关。我无法在最新的 21.2 版本上重现它。

将它包装成一个子查询,并用 LAG 检查前面的元素是否没有改变。

select 
  person_number
, case 
  when elements = lag(elements) over (partition by person_number order by batch_id)
  then '' 
  else elements 
  end as elements
, batchid
, co_code
from
(
    select 
     papf.person_number, 
     elem.elements, 
     batch.batchid, 
     comp.co_code
    from company_det as comp
    join per_all_people_f as papf 
      on papf.person_id = comp.person_id
    join elements_tab as elem
      on elem.element_id = comp.element_id
    join batch_tab as batch
      on batch.batchid = comp.batchid 

    union all

    select 
     papf.person_number,
     absc.absence_name,
     batch.batchid,
     comp.co_code
    from company_det as comp
    join per_all_people_f as papf
      on papf.person_id = comp.person_id
    join absence_tab as absc
      on absc.absence_id = comp.absence_id
    join batch_tab as batch
      on batch.batchid = comp.batchid
) q
order by person_number, batch_id