我正在处理查找重复记录的古老问题。我是那里的大部分方式,并有一个查询的工作,但我无法适应它包括可能在几个字段中的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,但可能需要进行下一步,除非有一个简单的方法来在这个阶段做到这一点。
你可以发布具有预期结果的样本记录吗? – 2013-02-12 03:08:32
编辑样本结果表 – user2035835 2013-02-12 03:17:12