2013-02-12 35 views
0

我正在處理查找重複記錄的古老問題。我是那裏的大部分方式,並有一個查詢的工作,但我無法適應它包括可能在幾個字段中的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,但可能需要進行下一步,除非有一個簡單的方法來在這個階段做到這一點。

+0

你可以發佈具有預期結果的樣本記錄嗎? – 2013-02-12 03:08:32

+0

編輯樣本結果表 – user2035835 2013-02-12 03:17:12

回答

0

它會出現在您的查詢是不工作,因爲x.field1=x2.field2應該x.field1=x2.field1

+0

糟糕,這是我的錯誤。這不在實際的查詢中,只是在我的記憶中。 – user2035835 2013-02-12 03:18:00

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.fieldXx2.fieldX時,找到匹配的NULL S,他們都需要是NULL,而不是一個或另一個(AND,而不是OR)。

+0

謝謝!我懷疑那裏需要加入,但我不知道該怎麼做。但是,我確實需要結果,其中NULL存在於任何列中,而不僅僅是NULL匹配的地方。我可能只需要匹配NULL字段,但至少在開始時我需要查看包含NULL的所有行。 – user2035835 2013-02-12 04:22:09