私のデータベースで(可能性のある)重複した顧客を検出するSQLクエリを作成しようとしています:
私は2つのテーブルを持っています:
- 列を持つ顧客: cid、firstname、lastname、zip。cid は、このテーブルの一意の顧客 ID および主キーであることに注意してください。
- 列を持つIgnoreForDuplicateCustomer : cid1、cid2。両方の列は、Customer(cid) を参照する外部キーです。このテーブルは、cid1 を持つ顧客が cid2 を持つ顧客と同じではないことを示すために使用されます。
たとえば、私が持っている場合
- cid = 1、firstname="foo"、lastname="anonymous"、zip="11231" の Customer エントリ
- cid=2、firstname="foo"、lastname="anonymous"、および zip="11231" の別の Customer エントリ。
したがって、私のSQLクエリは、姓、名、郵便番号が同じ顧客を検索し、cid = 1の顧客がcid = 2の顧客と同じであることを検出する必要があります.
ただし、cid1 = 1 と cid2 = 2 を設定して IgnoreForDuplicateCustomer テーブルに新しいエントリを格納することにより、顧客の cid = 1 と cid=2 が同じでないと言うことができるはずです。
したがって、重複した顧客の検出は、次の SQL クエリ スクリプトでうまく機能します。
SELECT cid, firstname, lastname, zip, COUNT(*) AS NumOccurrences
FROM Customer
GROUP BY fistname, lastname,zip
HAVING ( COUNT(*) > 1 )
私の問題は、IgnoreForDuplicateCustomer テーブルを統合できないことです。前の例のように、cid = 1 と cid=2 の顧客は、エントリ/ルールがあるため、同じものとしてマーク/クエリされません。 IgnoreForDuplicateCustomer テーブルで。
そこで、where 句を追加して以前のクエリを拡張しようとしました。
SELECT cid, firstname, lastname, COUNT(*) AS NumOccurrences
FROM Customer
WHERE cid NOT IN (
SELECT cid1 FROM IgnoreForDuplicateCustomer WHERE cid2=cid
UNION
SELECT cid2 FROM IgnoreForDuplicateCustomer WHERE cid1=cid
)
GROUP BY firstname, lastname, zip
HAVING ( COUNT(*) > 1 )
残念ながら、この追加の WHERE 句は私の結果にはまったく影響しません。助言がありますか?