我试图创建一个 sql 查询,它将在我的数据库中检测(可能)重复的客户:
我有两张桌子:
- 具有以下列的客户:cid、名字、姓氏、zip。请注意, cid 是此表的唯一客户 ID 和主键。
- IgnoreForDuplicateCustomer具有以下列:cid1、cid2。两列都是外键,引用了 Customer(cid)。这张表是用来说cid1的客户和cid2的客户是不一样的。
例如,如果我有
- cid = 1、firstname="foo"、lastname="anonymous" 和 zip="11231" 的客户条目
- 以及另一个带有 cid=2、firstname="foo"、lastname="anonymous" 和 zip="11231" 的客户条目。
所以我的 sql 查询应该搜索具有相同名字、姓氏和 zip 的客户,并且检测到 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 子句对我的结果完全没有影响。有什么建议么?