Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Удалить дубли разных полей где A=B, B=A  [new]
ИванПетрович
Member

Откуда: Екатеринбург
Сообщений: 45
Имеем табличку со значениями

IDAB
111
212
313
421
522
623
731
832
933


необходимо удалить дубликаты строк, в которых значения A и B при перестановке местами равны A и B

т.е. A=1, B=2 является дублем A=2, B=1 и должно быть удалено, при этом одно значение A=B должно остаться

Должен получиться результат

IDAB
111
212
313
522
623
933


Удалённые позиции

IDAB
421
731
832


Пробовал уж и курсором, грохает все записи и всё тут. И как то так пробовал.

select A.a, A.b from #a A
join #b B on A.a=B.b and A.b=B.a and A.id<>A.id
order by A.A, A.b


Должно быть простое решение, подскажите, не могу найти ответ...

автор
Microsoft SQL Server 2005 - 9.00.1399.06
3 июл 13, 15:04    [14516968]     Ответить | Цитировать Сообщить модератору
 Re: Удалить дубли разных полей где A=B, B=A  [new]
Glory
Member

Откуда:
Сообщений: 104751
select A.a, A.b from #a A
execpt
select b.b, b.a from #a B
3 июл 13, 15:07    [14516999]     Ответить | Цитировать Сообщить модератору
 Re: Удалить дубли разных полей где A=B, B=A  [new]
Сергей Викт.
Member

Откуда: Москва
Сообщений: 888
Glory
select A.a, A.b from #a A
execpt
select b.b, b.a from #a B

Так не останется ни одного значения... из двух совпадающих, но суть такая) либо через intersect попробовать вытащить.
3 июл 13, 15:12    [14517043]     Ответить | Цитировать Сообщить модератору
 Re: Удалить дубли разных полей где A=B, B=A  [new]
Мистер Хенки
Member

Откуда: канализация
Сообщений: 6615
declare @t table (id int,A int ,B int)
insert into @t (id,A,B)
values
(1,	1,	1)
,(2,	1,	2)
,(3,	1,	3)
,(4,	2,	1)
,(5,	2,	2)
,(6,	2,	3)
,(7,	3,	1)
,(8,	3,	2)
,(9,	3,	3)

;with forDel as(
select t1.id
from	@t t1
		inner join @t t2
		on t1.A = t2.B
			and t1.B = t2.A
			and t1.id>t2.id
)
delete t from @t t inner join forDel d on t.id = d.id

select * from @t	
3 июл 13, 15:14    [14517061]     Ответить | Цитировать Сообщить модератору
 Re: Удалить дубли разных полей где A=B, B=A  [new]
Сергей Викт.
Member

Откуда: Москва
Сообщений: 888
ИванПетрович,

select A.a, A.b from @t A
join @t B on A.a=B.b and A.b=B.a and B.id>A.id
order by A.A, A.b
3 июл 13, 15:15    [14517086]     Ответить | Цитировать Сообщить модератору
 Re: Удалить дубли разных полей где A=B, B=A  [new]
ИванПетрович
Member

Откуда: Екатеринбург
Сообщений: 45
Сергей Викт.
ИванПетрович,

select A.a, A.b from @t A
join @t B on A.a=B.b and A.b=B.a and B.id>A.id
order by A.A, A.b


Работает, но в этом он A=B теряет
3 июл 13, 15:21    [14517156]     Ответить | Цитировать Сообщить модератору
 Re: Удалить дубли разных полей где A=B, B=A  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
WITH CTE(N) AS
(
 SELECT ROW_NUMBER()OVER(PARTITION BY CASE WHEN A<=B THEN A ELSE B END,CASE WHEN A<=B THEN B ELSE A END ORDER BY ID)
 FROM T
)
DELETE CTE WHERE N>1;
3 июл 13, 15:24    [14517187]     Ответить | Цитировать Сообщить модератору
 Re: Удалить дубли разных полей где A=B, B=A  [new]
aleks2
Guest
iap
WITH CTE(N) AS
(
 SELECT ROW_NUMBER()OVER(PARTITION BY CASE WHEN A<=B THEN A ELSE B END,CASE WHEN A<=B THEN B ELSE A END ORDER BY ID)
 FROM T
)
DELETE CTE WHERE N>1;


Охренеть!
Проще надо. И понятней.

declare @t table (id int,A int ,B int)
insert into @t (id,A,B)
values
(1,	1,	1)
,(2,	1,	2)
,(3,	1,	3)
,(4,	2,	1)
,(5,	2,	2)
,(6,	2,	3)
,(7,	3,	1)
,(8,	3,	2)
,(9,	3,	3)

delete t
 from @t t 
 where exists(select * from @t x where x.id<t.id and x.A = t.A and x.B = t.B )

delete t
 from @t t 
 where exists(select * from @t x where x.id < t.id and x.A = t.B and x.B = t.A )
 
select * from @t
3 июл 13, 15:28    [14517214]     Ответить | Цитировать Сообщить модератору
 Re: Удалить дубли разных полей где A=B, B=A  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
aleks2
iap
WITH CTE(N) AS
(
 SELECT ROW_NUMBER()OVER(PARTITION BY CASE WHEN A<=B THEN A ELSE B END,CASE WHEN A<=B THEN B ELSE A END ORDER BY ID)
 FROM T
)
DELETE CTE WHERE N>1;
Проще надо. И понятней.
Куды ж проще-то!
Зато
aleks2
Охренеть!
3 июл 13, 15:30    [14517243]     Ответить | Цитировать Сообщить модератору
 Re: Удалить дубли разных полей где A=B, B=A  [new]
ИванПетрович
Member

Откуда: Екатеринбург
Сообщений: 45
iap
WITH CTE(N) AS
(
 SELECT ROW_NUMBER()OVER(PARTITION BY CASE WHEN A<=B THEN A ELSE B END,CASE WHEN A<=B THEN B ELSE A END ORDER BY ID)
 FROM T
)
DELETE CTE WHERE N>1;


Вы не первый раз мне помогаете, спасибо, работает. Всю изящность вашей идеи понял и поражаюсь ей....
3 июл 13, 15:35    [14517273]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить