Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Microsoft SQL Server |
![]() ![]() |
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] Ответить | Цитировать Сообщить модератору |
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] Ответить | Цитировать Сообщить модератору |
invm Member Откуда: Москва Сообщений: 9634 |
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] Ответить | Цитировать Сообщить модератору |
iap Member Откуда: Москва Сообщений: 47049 |
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] Ответить | Цитировать Сообщить модератору |
iap Member Откуда: Москва Сообщений: 47049 |
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 | ![]() |