MySQL调整查找重复查询以包含NULL

时间:2013-02-12 03:07:21

标签: mysql null duplicates

我正在解决查找重复记录的古老问题。我大部分时间都在那里并且有一个有效的查询,但是我无法适应它以包含在几个字段中可能的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。我现在需要调整此查询以包含NULL值的可能性,例如field2和field3。我希望我的查询不仅返回所有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放在同一行,但除非在此阶段有一种简单的方法,否则可能必须是下一步。

2 个答案:

答案 0 :(得分:0)

您的查询似乎无效,因为x.field1=x2.field2应为x.field1=x2.field1

答案 1 :(得分: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.fieldXx2.fieldX时,为了找到匹配的NULL,它们都需要NULL,而不是一个或另一个AND },而不是OR)。