2011-10-18 99 views
0

我有一個Customers表,其中有一個名爲CustomerID,CustomerNumber的列。我有一個Orders表,它引用了Customers中的CustomerID表。查找/刪除與另一個表無關的重複記錄

我需要找到並刪除訂單表中沒有訂單的CustomerNumber的所有重複記錄。

這是我如何找到我的副本在客戶,但我不知道如何通過訂單表過濾掉,然後刪除多餘的記錄:

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 

編輯:

如何刪除記錄是例低。對於符合上述標準的每條記錄,這將設置IsDeleted爲1,AND不是最低的customeridCustomerNumber。爲了更清晰的回答,你需要給你的表格佈局和關係。

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

他們會全部消失還是隻是愚蠢?我需要留下每一份的副本。其實我需要做一個軟刪除,我設置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 

注:沒有測試的代碼,可能需要調整。