0

我正在解决查找重复记录的古老问题。我大部分时间都在那里并且有一个可以工作的查询,但是我在调​​整它以包含多个字段中可能的 NULL 值时遇到了麻烦。这是我所拥有的(PartID 是唯一字段,所有其他字段都包含可能的重复值):

SELECT * 
    FROM PartData AS x
        INNER JOIN x on PartData AS x2 
        ON x.field1=x2.field1 AND x.field2=x2.field2 AND x.field3=x2.field3 AND x.field4=x2.field4
    WHERE x.PartID<>x2.PartID

这工作正常,并找到我没有字段为 NULL 的重复记录。我现在需要调整这个查询,以在比如说 field2 和 field3 中包含 NULL 值的可能性。我希望我的查询不仅返回所有 4 个字段都匹配的记录,而且还返回任何字段为 NULL 的记录(以确定是否重复或只是缺少信息)。

在我的搜索中,我遇到了这种方法:

SELECT * 
    FROM PartData AS x
         WHERE EXISTS (SELECT PartID FROM PartData AS x2
    WHERE (x.field1=x2.field1 OR (x.field1 IS NULL) OR (x2.field1 IS NULL)) AND
          (x.field2=x2.field2 OR (x.field2 IS NULL) OR (x2.field2 IS NULL)) AND
          (x.field3-x2.field3 OR (x.field3 IS NULL) OR (x2.field3 IS NULL)) AND
          (x.field4=x2.field4 OR (x.field4 IS NULL) OR (x2.field4 IS NULL)) AND
          x.PartID<>x2.PartID)

但是当我尝试这个时,它返回 0 行。这是不正确的,因为我知道有重复项并且我之前的查询返回了它们。是不是因为第二个版本没有JOIN?我在这里想念什么?

编辑:我希望看到看起来像这样的结果:

PartID   field1    field2    field3    field4

1234     1000      2000      NULL      4000
1235     1000      2000      3000      NULL
1241     1001      2001      3001      4001
1242     1001      2001      3001      4001
1253     1002      NULL      NULL      4002
1254     1002      NULL      NULL      4002
1265     1003      2002      2003      NULL
1266     1003      2002      2003      2004

其中每“对”行代表一个重复或可能的重复。它们可以具有全面匹配的值、匹配的值和匹配的 NULL,或者只是在某处包含一个 NULL。

更理想的是,我希望结果看起来像这样:

PartID   field1    field2    field3    field4    PartIDa

1234     1000      2000      NULL      4000      1235
1235     1000      2000      3000      NULL      1234
1241     1001      2001      3001      4001      1242
1242     1001      2001      3001      4001      1241
1253     1002      NULL      NULL      4002      1254
1254     1002      NULL      NULL      4002      1253
1265     1003      2002      2003      NULL      1266
1266     1003      2002      2003      2004      1265

在同一行中使用重复的 PartID,但这可能必须是下一步,除非在这个阶段有一种简单的方法可以做到这一点。

4

2 回答 2

0

尝试像这样修改您的查询:

SELECT *
  FROM PartData AS x
       INNER JOIN PartData AS x2 ON
         (x.field1=x2.field1 OR (x.field1 IS NULL AND x2.field1 IS NULL)) AND
         (x.field2=x2.field2 OR (x.field2 IS NULL AND x2.field2 IS NULL)) AND
         (x.field3=x2.field3 OR (x.field3 IS NULL AND x2.field3 IS NULL)) AND
         (x.field4=x2.field4 OR (x.field4 IS NULL AND x2.field4 IS NULL))
 WHERE x.PartID<>x2.PartID

请注意,在比较x.fieldX和时x2.fieldX,要找到匹配NULL的 s,它们都需要是NULL,而不是一个或另一个(AND,不是OR)。

于 2013-02-12T03:35:30.610 回答
0

您的查询似乎不起作用,因为x.field1=x2.field2应该是x.field1=x2.field1

于 2013-02-12T03:13:17.057 回答