2013-02-12 83 views
0

我正在处理查找重复记录的古老问题。我是那里的大部分方式,并有一个查询的工作,但我无法适应它包括可能在几个字段中的NULL值。这里是我有什么(PARTID是唯一的字段和所有其他领域可能包含重复的值):MySQL修改查找重复查询以包含NULL

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。我希望我的查询不仅返回所有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,但可能需要进行下一步,除非有一个简单的方法来在这个阶段做到这一点。

+0

你可以发布具有预期结果的样本记录吗? – 2013-02-12 03:08:32

+0

编辑样本结果表 – user2035835 2013-02-12 03:17:12

回答

0

它会出现在您的查询是不工作,因为x.field1=x2.field2应该x.field1=x2.field1

+0

糟糕,这是我的错误。这不在实际的查询中,只是在我的记忆中。 – user2035835 2013-02-12 03:18:00

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 S,他们都需要是NULL,而不是一个或另一个(AND,而不是OR)。

+0

谢谢!我怀疑那里需要加入,但我不知道该怎么做。但是,我确实需要结果,其中NULL存在于任何列中,而不仅仅是NULL匹配的地方。我可能只需要匹配NULL字段,但至少在开始时我需要查看包含NULL的所有行。 – user2035835 2013-02-12 04:22:09