Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL调整查找重复项查询以包含NULL_Mysql_Null_Duplicates - Fatal编程技术网

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

MySQL调整查找重复项查询以包含NULL,mysql,null,duplicates,Mysql,Null,Duplicates,我正在解决寻找重复记录这一古老问题。我大部分时间都在那里,并且有一个可以工作的查询,但是我在调整它以包括几个字段中可能出现的空值方面遇到了困难。以下是我所拥有的(PartID是唯一字段,所有其他字段都包含可能的重复值): 其中,每对行表示一个重复或可能的重复。它们可以有所有的匹配值,匹配值和匹配空值,或者只是在某个地方包含空值 更理想的情况是,我希望结果如下: PartID field1 field2 field3 field4 1234 1000 20

我正在解决寻找重复记录这一古老问题。我大部分时间都在那里,并且有一个可以工作的查询,但是我在调整它以包括几个字段中可能出现的空值方面遇到了困难。以下是我所拥有的(PartID是唯一字段,所有其他字段都包含可能的重复值):

其中,每对行表示一个重复或可能的重复。它们可以有所有的匹配值,匹配值和匹配空值,或者只是在某个地方包含空值

更理想的情况是,我希望结果如下:

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