Sql 一个查询调用相同表的两个实例,并将它们连接到比较字段,从而得到镜像结果。如何消除镜像重复项?

Sql 一个查询调用相同表的两个实例,并将它们连接到比较字段,从而得到镜像结果。如何消除镜像重复项?,sql,oracle,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

这是我的查询的一个更简单的版本

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,并对当天早些时候提交的ID执行操作(查询每天运行,只需要从给定日期复制)。我对SQL/Oracle还比较陌生,不知道是否有更好的方法来解决这个问题

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条记录

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

这从您的目标语句中假设您希望对每个文件\标记的最早一行执行某些操作。内部查询只返回创建日期为当天某个时间的行

这将使您获得每个文件标记中的第一(最早)行,其中至少有2条记录

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


这从您的目标语句中假设您希望对每个文件\标记的最早一行执行某些操作。内部查询仅返回创建日期为当天某个时间的行。

以下是一种简单的方法,只需更改比较操作即可:

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 
选择不同的Alias1.ID ID_1、Alias2.ID ID_2、Alias1.file_标记,
别名1.creation\u date在\u dt1中,别名2.creation\u date在\u dt2中
从别名1连接
别名2
在Alias1.file_标记上=Alias2.file_标记
别名1.ID<别名2.ID
按别名排序1.creation\u dt desc

用少于两个想法的顺序替换“不等于”,这样较小的想法总是第一个。这将消除重复项。注意:我还修复了连接语法。

这里有一个简单的方法,只需更改比较操作:

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 
选择不同的Alias1.ID ID_1、Alias2.ID ID_2、Alias1.file_标记,
别名1.creation\u date在\u dt1中,别名2.creation\u date在\u dt2中
从别名1连接
别名2
在Alias1.file_标记上=Alias2.file_标记
别名1.ID<别名2.ID
按别名排序1.creation\u dt desc


用少于两个想法的顺序替换“不等于”,这样较小的想法总是第一个。这将消除重复项。注意:我还修复了连接语法。

我不确定是否理解您的要求,但将替换
和Alias1.ID!=Alias2.ID
with
和Alias1.ID>Alias2.ID
do?对于同一个标记,您总是最多有两个条目吗?@Dems:我们可能会看到三个或多个结果共享同一个标记,或者一个,或者一个都没有。@a.B.Cade抱歉,但这没有帮助。重要字段是标签和日期。如果标签匹配,我们需要比较日期。我不确定我是否理解您想要什么,但将替换
和Alias1.ID!=Alias2.ID
with
和Alias1.ID>Alias2.ID
do?对于同一个标记,您总是最多有两个条目吗?@Dems:我们可能会看到三个或多个结果共享同一个标记,或者一个,或者一个都没有。@a.B.Cade抱歉,但这没有帮助。重要字段是标签和日期。如果标签匹配,我们需要比较日期。您不想在其中包含一个
count(*)(按文件分区\u标签)
,以确保至少有两个吗?我将编辑上面的问题,但这将是每天运行的,并且只查看给定日期的结果。为了清楚起见,我省略了它,但最终查询的一部分还选择了in_dt=sysdate中的位置。这很有帮助,但它返回了所有唯一的结果,而不考虑重复的结果,并且返回了最近的条目,而不是当天早些时候发布的条目。另一个答案只返回当天重复项的最早结果。@b如果您
按创建排序\u date desc
,它将返回当天早些时候的结果,并且其中的
计数(*)
现在应确保至少有一个重复项。您不希望
计数(*)超过(按文件分区标记)吗
为了确保至少有两个问题,我将编辑上面的问题,但这将是每天运行的,只查看给定日期的结果。为了清楚起见,我省略了它,但最终查询的一部分还选择了in_dt=sysdate中的位置。这很有帮助,但它返回了所有唯一的结果,而不考虑重复的结果,并且返回了最近的条目,而不是当天早些时候发布的条目。另一个答案只返回当天重复项的最早结果。@b如果您
按创建顺序_datedesc
它将返回当天早些时候的结果,其中的
计数(*)
现在应确保至少有一个重复项。谢谢,这满足了我的需要,但还需要进一步测试。谢谢,这就是我所需要的,不过还需要进一步测试。