я пытаюсь создать SQL-запрос, который обнаружит (возможно) дублирующих клиентов в моей базе данных:
У меня есть две таблицы:
- Клиент со столбцами: cid, имя, фамилия, zip. Обратите внимание, что cid - это уникальный идентификатор клиента и первичный ключ для этой таблицы.
- IgnoreForDuplicateCustomer со столбцами: cid1, cid2. Оба столбца являются внешними ключами, на которые ссылается Customer (cid). Эта таблица используется, чтобы сказать, что клиент с cid1 отличается от клиента с cid2.
Так, например, если у меня есть
- запись клиента с cid = 1, firstname = "foo", lastname = "anonymous" и zip = "11231"
- и еще одна запись клиента с cid = 2, firstname = "foo", lastname = "anonymous" и zip = "11231".
Таким образом, мой sql-запрос должен искать клиентов с одинаковыми именем, фамилией и почтовым индексом, и обнаруживать, что клиент с cid = 1 совпадает с клиентом с cid = 2.
Однако можно сказать, что cid клиента = 1 и cid = 2 - это не одно и то же, сохраняя новую запись в таблице IgnoreForDuplicateCustomer, устанавливая cid1 = 1 и cid2 = 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 абсолютно не влияет на мой результат.
Есть предложения?