2016-01-22 18 views
4

刪除重複的元組我有一個表如下如何使用SQL

Col1 Col2 
12 34 
34 12 

考慮,這些是重複的,我們怎麼刪除? 我試着用自連接來解決這個問題。但我無法得到所需的答案。有人可以幫忙嗎?

+0

所以你的條件重複是兩列是可以互換的? – Coderchu

+0

是的。如果它們在任一欄中,它們具有相同的含義。 –

+0

你必須考慮這兩列重複 –

回答

4

可以使用GREATESTLEAST到「訂單」的欄目,然後用不同的:

SELECT DISTINCT GREATEST(col1, col2) as first, LEAST(col1, col2) as second from yourTable 

這會給你一個不同的結果。如果你在尋找什麼是刪除,你不能在這個結果中刪除的所有內容:

DELETE FROM yourTable where (col1, col2) NOT IN (
    SELECT DISTINCT GREATEST(col1, col2) as first, LEAST(col1, col2) as second from yourTable 
) 
+0

如果我在同一個表中有非重複的元組,它會起作用嗎? –

0

MySQL的句法:

DELETE b 
FROM mytable a, mytable b 
WHERE a.col1 = b.col2 AND a.col2 = b.col1 AND a.col1 > b.col2; 

如果這兩個值相同,它不工作,但你有一個獨特的約束,以防止重複在這種情況下,對嗎?

1

我假設你想要有一個對稱關係:例如,如果A是B的朋友,那麼B也是A的朋友?我還假設這兩列都是外部ID和數字。如果不是這樣,你將不得不適應。

最好的方法是永遠不要插入兩個版本;規範化關係,使較小的總是在Col1中,而較大的總是在Col2中。即對於13 -> 27,您應該插入[13, 27];對於27 -> 13,如果它不再出現,則會再次插入[13, 27]

如果你已經有了一個搞砸了表,我可能只是做:

UPDATE IGNORE t 
SET col1=(@temp:=col1), col1 = col2, col2 = @temp 
WHERE col1 > col2; 

正常化它(沒有嘗試,可能有誤差;此外,MySQL的語法,你可能有適應其他發動機);那麼這將刪除額外的情況下,兩個方向的情況下存在:

DELETE FROM t 
WHERE col1 > col2;