найти / удалить дубликаты записей, которые не имеют отношения к другой таблице - PullRequest
0 голосов
/ 18 октября 2011

У меня есть таблица Customers со столбцами под названием CustomerID, CustomerNumber.У меня есть таблица Orders, которая ссылается на таблицу CustomerID в Customers.

Мне нужно найти и удалить все дубликаты записей для CustomerNumber, которые НЕ имеют заказов в таблице Orders.

Вот как я могуя нахожу свои дубликаты в клиентах, но не знаю, как отфильтровать их по таблице заказов, а затем удалить лишние записи:

SELECT Name, CustomerNumber, COUNT(*) As DupeCount
FROM StagingCustomers 
WHERE ManufacturerID=15
GROUP BY Name, CustomerNumber
HAVING COUNT(CustomerNumber) > 1
ORDER BY CustomerNumber

Ответы [ 2 ]

3 голосов
/ 18 октября 2011

Добавьте предложение EXISTS для проверки любых записей без отношения:

SELECT Name, CustomerNumber, COUNT(*) As DupeCount
FROM StagingCustomers S
WHERE ManufacturerID=15
AND NOT EXISTS (SELECT 1 from Orders WHERE CustomerID = S.CustomerID)
GROUP BY Name, CustomerNumber
HAVING COUNT(CustomerNumber) > 1
ORDER BY CustomerNumber

EDIT:

Пример того, как удалить записи ниже. Это установит IsDeleted в 1 для каждой записи, которая соответствует вышеуказанным критериям, И не является самым низким customerid на CustomerNumber. Чтобы получить более четкий ответ, вам необходимо указать расположение и отношения к вашему столу.

UPDATE  S
SET IsDeleted = 1
FROM StagingCustomers S
WHERE ManufacturerID=15
AND NOT EXISTS (SELECT 1 from Orders WHERE CustomerID = S.CustomerID)
AND CustomerID NOT IN (SELECT CustomerNumber, MIN(CustomerID)
                       FROM StagingCustomers
                       GROUP BY CustomerNumber)
GROUP BY Name, CustomerNumber
HAVING COUNT(CustomerNumber) > 1
ORDER BY CustomerNumber
0 голосов
/ 19 октября 2011

Примерно так же может работать:

SELECT Name, CustomerNumber, COUNT(*) As DupeCount
FROM StagingCustomers AS SC
LEFT JOIN ORDERS AS OD ON SC.CustomerID = OD.CustomerID
WHERE OD.CustomerID IS NULL AND ManufacturerID = 15
GROUP BY Name, CustomerNumber
HAVING COUNT(CustomerNumber) > 1
ORDER BY CustomerNumber

ПРИМЕЧАНИЕ. Код не тестировался, возможно, потребуется настроить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...