在Oracle中,他们是否有任何方法可以确定是否只显示一行是因为连接导致多于一行的返回?
我会解释:
我有2个表,比如说这个例子的SO和PO。
SO是驾驶表,并加入PO。 PO每个SO可以返回超过1个记录。这是理想的,但是我希望能够有一个列来指示结果集的SO记录是否重复(因为只显示因为PO连接导致它重复)。
我想在Crystal Reports中使用此标识符来抑制报表上的前半部分字段,因为这是不需要多次显示的重复数据。
我还应该补充一点,我正在对这些数据进行一些分组,我刚刚意识到这意味着除非我将它们添加到组中,否则我不能做大量的事情,我不能这样做。
答案 0 :(得分:1)
row_number() over(partition by SO.join_id order by PO.something) as r
并抑制r > 1
。
更新:您不一定需要按连接条件进行分区。按你想抑制的任何方式进行分区。
13:35:44 SYSTEM@dwal> ed
Wrote file S:\\tools\buffer.sql
1 select decode(rn, 1, owner) owner, object_type, cnt
2 from (
3 select owner, object_type, count(*) cnt,
4 row_number() over(partition by owner order by owner, object_type desc) rn
5 from dba_objects
6 where owner in( 'SYSTEM', 'OUTLN')
7 group by owner, object_type
8* )
13:36:09 SYSTEM@dwal> / </s>
OWNER OBJECT_TYPE CNT
-------- ------------------- ----------
OUTLN TABLE 3
PROCEDURE 1
LOB 1
INDEX 5
SYSTEM VIEW 14
TYPE 1
TRIGGER 2
TABLE PARTITION 47
TABLE 159
SYNONYM 8
SEQUENCE 20
QUEUE 4
PROCEDURE 1
PACKAGE BODY 1
PACKAGE 1
LOB 23
INDEX PARTITION 72
OWNER OBJECT_TYPE CNT
-------- ------------------- ----------
INDEX 239
18 rows selected.
击> <击> 撞击> 在这种情况下,您需要对多个列进行多次分析,这很昂贵