我正在解决查找重复记录的古老问题。我大部分时间都在那里并且有一个有效的查询,但是我无法适应它以包含在几个字段中可能的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放在同一行,但除非在此阶段有一种简单的方法,否则可能必须是下一步。
答案 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.fieldX
和x2.fieldX
时,为了找到匹配的NULL
,它们都需要NULL
,而不是一个或另一个AND
},而不是OR
)。