2011-10-18 9 views
0

CustomerID、CustomerNumberという列を持つCustomersテーブルがあります。 CustomersのCustomerIDテーブルを参照するOrdersテーブルがあります。他のテーブルとの関連がない重複レコードの検索/削除

Ordersテーブルに注文を持たないCustomerNumberのすべての重複レコードを検索して削除する必要があります。

この私がお客様に私の重複を見つけています方法ですが、私はその後、余分なレコードを削除するordersテーブルでフィルタリングする方法がわからない:

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

答えて

3

すべてのレコードをチェックする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の最小値ではありません。より明確な答えを得るには、テーブルレイアウトと関係を与える必要があります。

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

これらの重複を取り除くにはどうすればいいですか? – Slee

+0

'SELECT'を' DELETE'に変更してしまいました。 – JNK

+0

彼らはすべて消えてしまうのだろうか?私はそれぞれのコピーを1枚残す必要があります。そして、実際には私が設定したソフト削除を行う必要があります。IsDeleted = 1 – Slee

0

このような何かがあまりにもうまくいくかもしれない:

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 

は注:コードをテストしていない、微調整が必​​要になる場合があります。

関連する問題