2009-12-31 88 views
2

嘿,所有。我有一個有相當數量的行的MSSQL 2008數據庫。到目前爲止,在將新行插入表之前,存儲過程會檢查數據庫中是否已存在該記錄(通過檢查標題爲「標題」的列)。此檢查是確切的,如果要插入的記錄略有不同,它將插入它而不是更新現有的行(這是近似匹配)。我想要做的是在插入之前以某種方式檢測表中的近似重複。因此,要插入一個新的記錄是:使用T-SQL查找大約重複的數據庫記錄?

The quick brown fox jumps over the lazy dog 

將大致匹配:

Quick brown fox jumps over the lazy dog 

如果在表中存在這個記錄了。我見過(並用於其他情況)在T-SQL中實現的Levenshtein Distance算法,但我不確定這是否可以應用於我的情況,因爲需要一對輸入字符串來執行算法。社區成員如何處理這類事情?謝謝。

回答

1

Full-Text Search是你最好的選擇。由於需要計算咕嚕聲,在任何非平凡大小的文本語料庫上使用Levenshtein很快就會出現問題。使用LD/SOUNDEX等基於字符的差異而不是基於字的差異更常見。假設文字至少拼寫正確,FTS會更合適。我也可以想象使用FTS來識別可能的匹配候選者的兩層方法,在篩選後的集合上執行更精細的匹配。如果你真的想去鎮上,那麼搜索文本的最好的結構之一是Trie,但這在表格中實施起來很棘手,並且作爲內存數據結構更好。一個基於n-gram解決方案的詞也可能值得研究。

4

如果您只需(批量)加載表格或定期刪除重複項目,則還可以在SSIS中使用模糊分組轉換 - 這是您的示例的結果。

fuzzygroup01

結果被_key_out分組, 「原始」 行由_key_in = _key_out標識。如果_key_out <> _key_in該行與之前的行類似 - 您可以設置最小相似度,分隔符,區分大小寫等。