2012-12-27 56 views
0

我已經閱讀了關於如何通過將表與其他實例進行比較來刪除重複項的幾篇文章,但是我不想刪除我想要的重複項比較它們。mySQL:如何識別基於四個字段的重複項

例如。我有「id」,「sold_price」,「bruksareal」,「kommunenr」,「Gårdsnr」,「Bruksnr」,「Festenr」,「Seksjonsnr」字段。所有字段都是int。

我想確定重複/相同的行(同一個行,kommunenr,gårdsnr,bruksnr,festenr和seksjonsnr)。如果相同,那麼我想給這些行一個唯一的參考號。

我相信,這將使得更容易識別我後來想在其他領域比較行(例如,如「sold_price」,「sold_date」等。)

我打開的建議如果你認爲我的做法是錯誤的...

+0

當你提到獨特的參考,是每個集合中的每個相同的行共享相同的參考? –

+0

是的,這就是我的意思 - –

+0

@ Chris_1983_Norway - 如果列'bruksareal','kommunenr','gårdsnr','bruksnr','festenr'和'seksjonsnr'應該是相同的行對嗎? –

回答

1

執行上表的連接到自身在所有領域,然後使用exists,查詢,如:

Update Table1 
Set reference = UUID() 
Where exists (
Select tb1.id 
from Table1 tb1 inner join Table1 tb2 on 
    tb1.Field1 = tb2.Field1 AND 
    tb1.Field2 = tb2.Field2 AND 
    etc 
Where tb1.Id = Table1.Id 
And tb1.Id != tb2.Id 
) 

其實你可以只用一個簡化加入

Update Table1 
Set reference = UUID() 
From Table1 inner join Table1 tb2 on 
     Table1.Field1 = tb2.Field1 AND 
     Table1.Field2 = tb2.Field2 AND 
     etc 
Where Table1.Id != tb2.Id 
0

根據你要做的地方,我會去散列實現。對於每個插入,計算所需列的哈希值(插入時可能會觸發),之後您應該能夠非常輕鬆地找出哪些行被複制(如果您爲該列編制索引,則查詢應該非常快,但請記住,這仍然不是一個int列,所以隨着時間的推移它會變慢一點)。

之後,你可以做任何你喜歡的重複記錄,而不需要對數據庫進行非常昂貴的查詢。

稍後編輯:確保將空值轉換爲某個定義的值,因爲如果操作數爲空,某些類似MD5的mysql函數將返回null。 concat也是如此 - 如果一個操作數爲null,它將返回null(雖然對於concat_ws同樣無效)。