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
我写了这个查询:
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