簡體   English   中英

mySQL:如何基於四個字段識別重復項

[英]mySQL: How to identify duplicates based on four fields

我已經閱讀了幾則關於如何通過將表與表本身的另一個實例進行比較來刪除重復項的文章,但是我不想刪除要比較的重復項。

例如。 我有字段“ id”,“ sold_price”,“ bruksareal”,“ kommunenr”,“Gårdsnr”,“ Bruksnr”,“ Festenr”,“ Seksjonsnr”。 所有字段均為int。

我想識別重復/相同的行(相同的bruksareal,kommunenr,gardsnr,bruksnr,festenr和seksjonsnr)。 如果相同,那么我想為這些行提供唯一的參考號。

我相信這將使識別以后要在其他字段上進行比較的行更加容易(例如,例如“ sold_price”,“ sold_date”等。)

如果您認為我的方法是錯誤的,我歡迎您提出建議。

在表上跨所有字段對其自身執行聯接,然后使用一個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

根據您想在何處執行此操作,我將執行哈希實現。 對於每個插入,在執行插入操作時(可能觸發),計算所需列的哈希值,然后,您應該能夠很容易地找出重復的行(如果您對該列進行索引,則查詢應該非常快,但請記住,它仍然不是int列,因此隨着時間的推移它會變慢一點。

之后,您可以對重復的記錄進行任何操作,而無需對數據庫進行非常昂貴的查詢。

以后的編輯:確保將空值轉換為某些定義的值,因為如果操作數為空,則某些MySQL函數(如MD5)將僅返回空值。 對於concat也是一樣-如果一個操作數為null,它將返回null(盡管對於concat_ws無效)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM