0

我试图比较同一个表中的记录,所以我按字段 ID、X、Y 和 Z 选择记录,并在 X、Y 和/或 Z 相等的地方匹配它们。为了进行比较,我将表连接到自身,然后将每条记录与其他记录进行比较

我的问题是,如果我有一条记录 A 与字段 Z 上的 10 个其他记录 BK 匹配,那么它将列出每个记录 BK,因为它在表的第二个实例中找到它们,旁边是它在第一个实例中找到的 A的表。然后当它在表的第一个实例中找到每个 BK 时,它会再次列出每个匹配的记录。在这种情况下,字段 Z 上有 11 条记录匹配,并且由于搜索的性质,我收到了 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;
4

2 回答 2

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)
于 2013-11-07T10:11:01.410 回答
0

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

         AND T1.ID < T2.ID;
于 2013-11-07T10:08:15.013 回答