这确实是一个格式问题,最好由客户端处理。例如,在 SQL*Plus 中,我们可以使用BREAK
....
SQL> select t1.*, t2.* from t1, t2
2 /
A B C D C1
--- --- --- --- ----------
aaa bbb ccc ddd 111
aaa bbb ccc ddd 222
SQL> break on a on b on c on d
SQL> select t1.*, t2.* from t1, t2
2 /
A B C D C1
--- --- --- --- ----------
aaa bbb ccc ddd 111
222
SQL>
注意:在没有任何进一步信息的情况下,我选择了笛卡尔积。
编辑
BREAK
是一个 SQL Plus 命令,它可以抑制行中的重复列。它仅适用于 SQL Plus 客户端。正如所料,它在 Oracle 的 SQL*Plus 用户指南中有所介绍。 了解更多。
我BREAK
以正确的做事方式为例,因为它是干净的并且正确地实现了关注点的分离。如果您使用的是不同的客户端,则需要使用其格式化功能。可以调整 SQL(见下文),但这会降低查询的实用性,因为我们不能在其他不想抑制重复值的地方重用查询。
无论如何,这是一种ROW_NUMBER()
在内联视图中使用分析函数的解决方案。
SQL> select * from t1
2 /
A B C D ID
--- --- --- --- ----------
eee fff ggg hhh 1
aaa bbb ccc ddd 2
SQL> select * from t2
2 /
C1 ID
---------- ----------
333 2
111 1
222 2
444 2
SQL> select t1_id
2 , case when rn = 1 then a else null end as a
3 , t2_id
4 , c1
5 from (
6 select t1.id as t1_id
7 , row_number () over (partition by t1.id order by t2.c1) as rn
8 , t1.a
9 , t2.c1
10 , t2.id as t2_id
11 from t1, t2
12 where t1.id = t2.id
13 )
14 order by t1_id, rn
15 /
T1_ID A T2_ID C1
---------- --- ---------- ----------
1 eee 1 111
2 aaa 2 222
2 2 333
2 2 444
SQL>
我选择不使用LAG()
,因为它只适用于固定偏移量,而且 T2 中的行数似乎是可变的。