查询调用连接到比较字段的相同表的两个实例,并提供镜像结果。如何消除镜像重复?

时间:2012-06-25 20:11:01

标签: sql oracle

这是我查询的简单版本。

Alias1 as 
(select distinct ID, file_tag, status, creation_date from tables where creation_dt >= sysdate and creation_dt <= sysdate + 1),

Alias2 as 
(select distinct ID, file_tag, status, creation_date from same tables creation_dt >= sysdate and creation_dt <= sysdate + 1)

select distinct Alias1.ID ID_1,
           Alias2.ID ID_2,
           Alias1.file_tag,
           Alias1.creation_date in_dt1,
           Alias2.creation_date in_dt2
    from   Alias1, Alias2
    where Alias1.file_tag = Alias2.file_tag
          and Alias1.ID != Alias2.ID
    order by Alias1.creation_dt desc

这是结果的一个例子。这两个都是相同的,虽然它们的值被翻转。

    ID_1 ID_2  File_Tag     in_dt1          in_dt2
    70   66    Apples       6/25/2012 3:06  6/25/2012 2:53:47 PM
    66   70    Apples       6/25/2012 2:53  6/25/2012 3:06:18 PM

查询的目标是找到具有匹配文件标记的多个ID,并对当天早些时候提交的ID执行操作(查询每天运行,并且只需要从给定日期开始重复)。我仍然是SQL / Oracle的新手,并想知道是否有更好的方法来解决这个问题。

2 个答案:

答案 0 :(得分:3)

SELECT *
  FROM (SELECT id, file_tag, creation_date in_dt
             , row_number() OVER (PARTITION BY file_tag 
                                      ORDER BY creation_date) rn
             , count(*) OVER (PARTITION BY file_tag) ct
          FROM tables
         WHERE creation_date >= TRUNC(SYSDATE)) tbls
 WHERE rn = 1
   AND ct > 1;

这可以让你获得今天至少有2条记录的每个file_tag中的第一行(最早)行。

内部选择按创建日期计算每组相同file_tag记录的相对行数。外部选择检索每个分区中的第一个。

这从您的目标声明中假定您希望对每个file_tag的最早单行执行某些操作。内部查询仅返回当天某个时间的creation_date的行。

答案 1 :(得分:1)

这是一种简单的方法,只需通过查找比较操作:

select distinct Alias1.ID ID_1, Alias2.ID ID_2, Alias1.file_tag,
       Alias1.creation_date in_dt1, Alias2.creation_date in_dt2
from Alias1 join
     Alias2
     on Alias1.file_tag = Alias2.file_tag and
        Alias1.ID < Alias2.ID
order by Alias1.creation_dt desc 

用两个以下的概念替换not-equals,因此较小的一个总是第一个。这将消除重复。注意:我还修复了连接语法。