Löschen von datasätzen aus der Tabelle mit a = b und b = a

Ich habe einen Tisch mit zwei Feldern, a und b. Einige datasätze sind in dem Sinne dupliziert, dass a = b und b = a. Ich möchte diese Aufzeichnungen löschen.

Bedenken Sie:

declare @temp table (a int, b int) insert into @temp values (1, 2) insert into @temp values (3, 4) insert into @temp values (4, 3) insert into @temp values (5, 6) --delete 3, 4 or 4, 3 select * from @temp /* a | b --|-- 1 | 2 3 | 4 5 | 6 or (I don't care which one) a | b --|-- 1 | 2 4 | 3 5 | 6 */ 

Wie kann ich das erreichen? Es muss Microsoft SQL server 2000 und höher unterstützen.

 DELETE x FROM TableName x INNER JOIN ( SELECT aA, aB FROM tableName a INNER JOIN tableName b ON ((aA = bA AND ab = bb) OR (aA = bB AND ab = bA)) AND aa > ba ) y ON xA = yA AND xB = yB 
  • SQLFiddle Demo

Hier ist eine Lösung für neuere Version von SQL server

 declare @temp table (a int, b int) insert into @temp values (1, 2) insert into @temp values (3, 4) insert into @temp values (4, 3) insert into @temp values (5, 6) insert into @temp values (6, 5) --delete 3, 4 or 4, 3 delete t3 --select * from (select t1.a, t1.b,rank() over (partition by t2.a +t2.b order by t1.a) as row_number from @temp t1 join @temp t2 on t2.a = t1.b and t2.b = t1.a)c join @temp t3 on ca =t3.a and cb = t3.b where c.row_number <>1 select * from @temp 

Posting nur um die neuere Syntax für alle anderen, die auf der search nach der gleichen Sache zu zeigen.