2013-03-13 4 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, и я должен сказать, классическая стратегия удаления дубликатов. Человек, которого я использовал раньше, на столах, потому что мои сверстники решили, что уникальное ограничение было просто смешным! –

+0

Спасибо, отлично работает для меня. – Trellmor

+0

приветствуется ': D' работает даже на SQL Server 2000? –

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 

Проводка, чтобы показать более новый синтаксис для всех, кто ищет то же самое ,

Смежные вопросы