2013-03-13 133 views
2

我有一個包含兩個字段a和b的表。某些記錄在a = b和b = a的意義上是重複的。我想刪除這些記錄。刪除表中的記錄,其中a = b和b = a

考慮一下:

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 
*/ 

我怎樣才能做到這一點?它需要支持Microsoft SQL Server 2000及更高版本。

回答

5
DELETE x 
FROM TableName x 
     INNER JOIN 
     (
      SELECT a.A, a.B 
      FROM tableName a 
        INNER JOIN tableName b 
         ON ((a.A = b.A AND a.b = b.b) OR 
          (a.A = b.B AND a.b = b.A)) AND 
         a.a > b.a 
     ) y ON x.A = y.A AND x.B = y.B 
+1

+1,我不得不說,經典的重複刪除策略。我之前在桌面上使用過這個,因爲我的同事們認爲一個獨特的約束是荒謬的! – 2013-03-13 15:52:19

+0

謝謝,對我完美的作品。 – Trellmor 2013-03-13 16:06:28

+0

不客氣':D'它甚至可以在sql server 2000上運行? – 2013-03-13 16:06:52

1

這裏是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 c.a =t3.a and c.b = t3.b 
where c.row_number <>1 

select * from @temp 

發佈的解決方案只是爲了顯示爲別人的新語法誰正在尋找同樣的事情。

相關問題