我正在處理查找重複記錄的古老問題。我是那裏的大部分方式,並有一個查詢的工作,但我無法適應它包括可能在幾個字段中的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