powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Как разверуть и удалить дубли
5 сообщений из 5, страница 1 из 1
Как разверуть и удалить дубли
    #39776702
newLoginSql
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Подскажите пожалуйста,
есть таблица вида ID1, ID2 с данными:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
DECLARE @t TABLE 
(
  [ID1] int,
  [ID2] int
)

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



Вот такие строки по сути являются дубликатами:
Код: sql
1.
2.
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 не важно)
...
Рейтинг: 0 / 0
Как разверуть и удалить дубли
    #39776707
Kopelly
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
2.
3.
Delete a
From @t a
join @t b on a.ID1 = b.ID2 and a.ID2 = b.ID1 and a.ID1 > b.ID2;
...
Рейтинг: 0 / 0
Как разверуть и удалить дубли
    #39776720
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
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;
...
Рейтинг: 0 / 0
Как разверуть и удалить дубли
    #39776725
iap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
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;
...
Рейтинг: 0 / 0
Как разверуть и удалить дубли
    #39776729
iap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invm, точно, ORDER BY в OVER() тут неважно какой. :(

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
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;
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Как разверуть и удалить дубли
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]