0

データベースで潜在的な重複を見つけようとしています。一部の人々は、名前または姓に「-」を追加したため (何らかの理由で) 重複している可能性があります。私のクエリは現在、「-」を持つ誰かと重複している可能性のある人を引き出しません。これを行う最良の方法は何ですか?

これはこれまでの私のクエリです

SELECT t1.FirstName, t1.LastName, t1.ID, t2.dupeCount
FROM Contact t1
INNER JOIN (
    SELECT FirstName, REPLACE(LastName, '-', ' ') as LastName, COUNT(*) AS dupeCount
    FROM Contact
    GROUP BY FirstName, LastName
    HAVING COUNT(*) > 1
) t2 ON ((SOUNDEX(t1.LastName) = SOUNDEX(t2.LastName) 
OR SOUNDEX(REPLACE(t1.LastName, '-', ' ')) like '%' + SOUNDEX(t2.LastName) + '%'  
OR SOUNDEX(REPLACE(t2.LastName, '-', ' ')) like '%' + SOUNDEX(t1.LastName) + '%' )
AND SOUNDEX(t1.FirstName) = SOUNDEX(t2.FirstName))
ORDER BY t1.LastName, t1.ID
4

2 に答える 2

0

レーベンシュタイン距離アルゴリズムのようなものが役立ちます。これは、文字列を別の文字列と同じにするために必要な編集の数を測定します。Oracle では、utl_match ライブラリの下に edit_distance という組み込み関数がありますが、SQL Server の組み込みバージョンについては知りません。

レーベンシュタイン距離と編集距離 SQL Server を Google で簡単に検索したところ、役立つ可能性のある他の結果の中で次のスタック オーバーフロー スレッドが見つかりました: T-SQL のレーベンシュタイン距離

レーベンシュタイン距離を取得するために呼び出すことができる関数を作成できる場合は、距離が < x であるかどうかでクエリをフィルタリングし、適切と思われるしきい値を設定するだけです。

于 2013-06-24T18:29:11.420 に答える
0

これは、1 つの Select ステートメントで修正できるものよりもはるかに複雑です。これに遭遇したときは、ストアド プロシージャを作成し、先頭と末尾のスペースを削除し、そこにあってはならない句読点を削除します (短縮されている場合と省略されている場合があるミドル ネームなど)。電話番号、住所/郵便番号の組み合わせ、および/または電子メール アドレスが同じ人物を指している場合。Soundex は役立ちますが、十分ではありません。

于 2013-06-24T18:23:17.920 に答える