MySQL调整查找重复项查询以包含NULL
我正在解决寻找重复记录这一古老问题。我大部分时间都在那里,并且有一个可以工作的查询,但是我在调整它以包括几个字段中可能出现的空值方面遇到了困难。以下是我所拥有的(PartID是唯一字段,所有其他字段都包含可能的重复值): 其中,每对行表示一个重复或可能的重复。它们可以有所有的匹配值,匹配值和匹配空值,或者只是在某个地方包含空值 更理想的情况是,我希望结果如下:MySQL调整查找重复项查询以包含NULL,mysql,null,duplicates,Mysql,Null,Duplicates,我正在解决寻找重复记录这一古老问题。我大部分时间都在那里,并且有一个可以工作的查询,但是我在调整它以包括几个字段中可能出现的空值方面遇到了困难。以下是我所拥有的(PartID是唯一字段,所有其他字段都包含可能的重复值): 其中,每对行表示一个重复或可能的重复。它们可以有所有的匹配值,匹配值和匹配空值,或者只是在某个地方包含空值 更理想的情况是,我希望结果如下: PartID field1 field2 field3 field4 1234 1000 20
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
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在同一行中,但这可能必须是下一步,除非在此阶段有一种简单的方法来执行此操作。您的查询似乎不起作用,因为
x.field1=x2.field2
应该是x.field1=x2.field1
尝试这样修改您的查询:
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
选择*
从PartData中选择x
内部连接零件数据为x2 ON
(x.field1=x2.field1或(x.field1为空,x2.field1为空))以及
(x.field2=x2.field2或(x.field2为空,x2.field2为空))以及
(x.field3=x2.field3或(x.field3为空,x2.field3为空))以及
(x.field4=x2.field4或(x.field4为空,x2.field4为空))
其中x.PartIDx2.PartID
请注意,在比较
x.fieldX
和x2.fieldX
时,要找到匹配的NULL
,它们都必须是NULL
,而不是一个或另一个(和,而不是或)。你能发布具有所需结果的样本记录吗?用样本结果表编辑,这是我的一个输入错误。这不在实际查询中,只在我的记忆中。谢谢!我怀疑那里需要加入,但我不知道该怎么做。然而,我确实需要在任何列中出现NULL的结果,而不仅仅是匹配NULL的结果。我可能最终只需要匹配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
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