复杂记录比较删除重复

时间:2013-11-07 10:04:30

标签: sql oracle toad

我正在尝试比较同一个表中的记录,因此我按字段ID,X,Y和Z选择记录,并在X,Y和/或Z相等的位置匹配它们。为了进行比较,我将表格连接到自身,然后将每条记录与其他记录进行比较

我的问题是,如果我有一个记录A匹配字段Z上的10个其他记录BK,它将列出每个记录BK,因为它在表的第二个实例中找到它们,以及它找到的A表的第一个实例。然后当它在表的第一个实例中找到B-K中的每一个时,它将再次列出每个匹配的记录。在这种情况下,有11个记录在字段Z上匹配,并且由于搜索的性质,我收到121行。我希望能够将副本标记为一对记录,无论它们配对的方式如何。

结果可能会在字段Z上列为A和C匹配。我希望它能够识别出C和A作为匹配是A和C的重复匹配。

我正在使用以下代码进行查询

SELECT T1.ID AS ID1,
   T2.ID AS ID2,
   T1.X AS X1,
   T2.X AS X2,
   T1.Y AS Y1,
   T2.Y AS Y2,
   T1.Z AS Z1,
   T2.Z AS Z2
FROM (SELECT ID,
           X,
           Y,
           Z
      FROM TABLE) T1
   JOIN (SELECT ID,
                X,
                Y,
                Z
           FROM TABLE) T2
      ON    (   T1.X = T2.X
             OR T1.Y = T2.Y
             OR T1.Z = T2.Z)
         AND T1.ID <> T2.ID;

2 个答案:

答案 0 :(得分:0)

要让每一对只出现一次,您可以尝试将最后一行更改为

         AND T1.ID < T2.ID;

答案 1 :(得分:0)

您可能想要使用exists()。

select < some columns >
  from table x as x1
 where exists (select 1
          from table x as x2
         where (x1.x = x2.x or x1.y = x2.y or x1.z = x2.z)
           and x1.id <> x2.id)