2

在 Oracle 中,他们是否有任何方法来确定一行是否仅由于导致超过 1 行返回的连接而显示?

我会解释:

对于这个例子,我有 2 个表,比如 SO 和 PO。

SO 是驱动表,并加入 PO。PO 可以为每个 SO 返回超过 1 条记录。这是需要的,但是我希望能够有一个列来指示结果集的 SO 记录是否重复(因为仅显示因为 PO 连接导致它重复)。

我想在 Crystal Reports 中使用此标识符来抑制报表上的前半部分字段,因为这是不需要多次显示的重复数据。

我还应该补充一点,我正在对这些数据进行一些分组,我刚刚意识到这意味着除非我将它们添加到 group by,否则我不能做大量的工作,这是我做不到的。

4

1 回答 1

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. 

在这种情况下,您将需要对多个列进行多次分析,这很昂贵

于 2012-11-26T04:51:30.893 回答