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

Откуда:
Сообщений: 10
Подскажите пожалуйста,
есть таблица вида ID1, ID2 с данными:
DECLARE @t TABLE 
(
  [ID1] int,
  [ID2] int
)

INSERT INTO @t([ID1], [ID2])
VALUES(1, 2),
(2, 1),
(3, 1),
(5, 3),
(3, 5)


Вот такие строки по сути являются дубликатами:
SELECT * FROM @t T1
INNER JOIN @t T2 ON T1.[ID1] = T2.[ID2]  AND T1.[ID2] = T2.[ID1]


Как мне удалить одну из них? Т.е. хочу, чтобы в таблице остались следующие значения:
1, 2 (или 2, 1 не важно)
3, 1
5, 3 (иди 3, 5 не важно)
20 фев 19, 13:08    [21815332]     Ответить | Цитировать Сообщить модератору
 Re: Как разверуть и удалить дубли  [new]
Kopelly
Member

Откуда: Красноярск
Сообщений: 289
Delete a
From @t a
join @t b on a.ID1 = b.ID2 and a.ID2 = b.ID1 and a.ID1 > b.ID2;
20 фев 19, 13:16    [21815341]     Ответить | Цитировать Сообщить модератору
 Re: Как разверуть и удалить дубли  [new]
invm
Member

Откуда: Москва
Сообщений: 9122
with t as
(
 select
  row_number() over (partition by case when ID1 < ID2 then ID1 else ID2 end, case when ID1 < ID2 then ID2 else ID1 end order by (select 1)) as rn
 from
  @t
)
delete from t where rn > 1;
20 фев 19, 13:37    [21815368]     Ответить | Цитировать Сообщить модератору
 Re: Как разверуть и удалить дубли  [new]
iap
Member

Откуда: Москва
Сообщений: 46953
DECLARE @t TABLE 
(
  [ID1] int,
  [ID2] int
)

INSERT @t([ID1], [ID2]) VALUES
,(1, 2)
,(2, 1)
,(3, 1)
,(5, 3)
,(3, 5);

WITH CTE(N) AS
(
 SELECT ROW_NUMBER()OVER
 (
  PARTITION BY
  (SELECT MIN(ID) FROM(VALUES([ID1]),([ID2]))T(ID))
 ,(SELECT MAX(ID) FROM(VALUES([ID1]),([ID2]))T(ID))
  ORDER BY (SELECT MIN(ID) FROM(VALUES([ID1]),([ID2]))T(ID))
 )
 FROM @t
)
DELETE CTE WHERE N>1;

SELECT * FROM @t;
20 фев 19, 13:40    [21815377]     Ответить | Цитировать Сообщить модератору
 Re: Как разверуть и удалить дубли  [new]
iap
Member

Откуда: Москва
Сообщений: 46953
invm, точно, ORDER BY в OVER() тут неважно какой. :(

DECLARE @t TABLE 
(
  [ID1] int,
  [ID2] int
)

INSERT @t([ID1], [ID2]) VALUES
 (1, 2)
,(2, 1)
,(3, 1)
,(5, 3)
,(3, 5);

WITH CTE(N) AS
(
 SELECT ROW_NUMBER()OVER
 (
  PARTITION BY
  (SELECT MIN(ID) FROM(VALUES([ID1]),([ID2]))T(ID))
 ,(SELECT MAX(ID) FROM(VALUES([ID1]),([ID2]))T(ID))
  ORDER BY 1/0
 )
 FROM @t
)
DELETE CTE WHERE N>1;

SELECT * FROM @t;
20 фев 19, 13:49    [21815390]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить