簡體   English   中英

檢查重復記錄的最佳方法

[英]Best way to check for duplicated records

我有兩個表AB ,關系從AB一對多。

A有5列:

a1, a2, a3, a4, a5 

B有5列

b1, b2, b3, b4, a1. 

注意a1是表B中的外鍵。

我有一個要求檢查表中的重復記錄,即所有屬性的任何兩個記錄都不應具有完全相同的值。

我能想到的最有效的方法是確定它們的唯一性,方法是創建一個校驗和類型的值並將其保留在表A的每一行中。但這需要額外的空間,而且我將必須確保校驗和確實是唯一的。

這是前進的最佳方式,還是我不知道其他方式?

例如,假設表ARules表,表BTrigger表。 現在, Rules表記錄了由不同用戶創建的各種規則(這意味着將在Rules表中映射到Users表)。 現在,我真正想要的是用戶不應該能夠創建相同的規則。 因此,當用戶保存規則時,我將運行查詢以檢查是否有針對該特定用戶的相同校驗和的記錄(如果是),然后給出適當的錯誤,否則我將讓用戶創建該記錄。我想這清楚了為什么我可以•對所有記錄施加唯一約束。

使用GROUP BY子句執行SELECT。 例如:

SELECT a1, a2, a3, a4, a5, COUNT(*) FROM #TempPersons GROUP BY a1, a2, a3, a4, a5 HAVING COUNT(*) > 1;

這將返回a1,a2,a3,a4,a5的結果以及該值出現多少次的計數

在這些列上具有UNIQUE約束似乎是可行的方法。

但是,僅是為了回答您的其他意見:我以前使用過額外的列來檢查過去的更改。 那時我做了類似的事情:

CONVERT([NVARCHAR](42),HASHBYTES('SHA1',CONCAT(Column1, '||', Column2, ...),(1))

我發現這是將許多列合並為單個哈希的一種不錯的方法,根據其內容而唯一,並且不會超出比例。 (我在數據倉庫環境中使用了此功能,用於根據業務密鑰檢查大型表的記錄級別更改。將其存儲為PERSISTED列,以允許索引也基於此鍵運行)。

暫無
暫無

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

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