[英]Best way to check for duplicated records
我有兩個表A
和B
,關系從A
到B
一對多。
A有5列:
a1, a2, a3, a4, a5
B有5列
b1, b2, b3, b4, a1.
注意a1
是表B中的外鍵。
我有一個要求檢查表中的重復記錄,即所有屬性的任何兩個記錄都不應具有完全相同的值。
我能想到的最有效的方法是確定它們的唯一性,方法是創建一個校驗和類型的值並將其保留在表A的每一行中。但這需要額外的空間,而且我將必須確保校驗和確實是唯一的。
這是前進的最佳方式,還是我不知道其他方式?
例如,假設表A
是Rules
表,表B
是Trigger
表。 現在, 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.