2011-11-18 52 views
0

伊夫刪除特定的行了一個表:SQL從選擇

UserA UserB UserBB UserAA 

例如:

1 2 2 1 
1 3 3 1 
2 1 1 2 
2 4 4 2 
2 5 5 2 
5 2 2 5 

我想實現的是刪除行(重複),如僅讓行作爲例如:

1 2 2 1 
1 3 3 1 
2 4 4 2 
2 5 5 2 



2 1 1 2 -> deleted because there is already 1 2 2 1 
5 2 2 5 -> deleted because there is already 2 5 5 2 

如何編寫這樣的查詢?

感謝您的幫助

+0

你是說,如果是A/B被交換,或AA/BB被交換,或者A兩個記錄是等價的/ B和AA/BB是否交換? – phatfingers

回答

1

- 查找重複的行

SELECT MAX(ID) as ID, CustName, Pincode FROM #Customers 
GROUP BY CustName, Pincode 
HAVING COUNT(*) > 1 

- 刪除重複的行

DELETE FROM #Customers 
WHERE ID IN 
(SELECT MAX(ID) FROM #Customers 
GROUP BY CustName, Pincode 
HAVING COUNT(*) > 1) 

從MSDN服用。 : http://archive.msdn.microsoft.com/SQLExamples/Wiki/View.aspx?title=DuplicateRows

讓我知道你是否無法從該代碼中找出它。

這可能會更接近您的需求。 :

DELETE FROM TABLE 
WHERE USERA IN (SELECT MAX(USERA) FROM TABLE 
GROUP BY USERA, USERB, USERBB, USERAA HAVING COUNT(*) > 1) 
0

下面還介紹了UserA和UserB在兩行之間相等但UserAA和UserBB切換相反的情況。你的問題有點不清楚究竟是什麼構成重複。但希望這至少能指出你在正確的方向。

我會首先將它變成SELECT聲明,並確保它返回您認爲應該刪除的行並僅返回那些行。

DELETE T1 
FROM 
    My_Table T1 
INNER JOIN My_Table T2 ON 
    (
     T2.UserA = T1.UserA AND 
     T2.UserB = T1.UserB AND 
     T2.UserAA = T1.UserBB AND 
     T2.UserBB = T1.UserAA AND 
     T2.UserAA < T2.UserBB 
    ) OR 
    (
     T2.UserA = T1.UserB AND 
     T2.UserB = T1.UserA AND 
     T2.UserAA = T1.UserAA AND 
     T2.UserBB = T1.UserBB AND 
     T2.UserA < T2.UserB 
    ) OR 
    (
     T2.UserA = T1.UserB AND 
     T2.UserB = T1.UserA AND 
     T2.UserAA = T1.UserBB AND 
     T2.UserBB = T1.UserAA AND 
     T2.UserA < T2.UserB 
    ) 
0

這足以只是補充:

當用戶A <用戶B