SQL - удалить дублирующиеся пары - PullRequest
6 голосов
/ 11 января 2011

Я использую SQLite для хранения набора ненаправленных ребер графа, используя два столбца, u и v. Например:

uv

12

3 2

2 1

3 4

Я уже прошел через SELECT DISTINCT * FROM и удалил все повторяющиеся строки.

Тем не менее, есть дубликаты, если мы помним, что это неориентированные ребра.В приведенном выше примере ребро (1,2) появляется дважды, один раз как (1,2) и один раз как (2,1), которые оба эквивалентны.

Я хочу удалить все такие дубликаты, оставив толькоодин из них, (1,2) или (2,1) - не имеет значения, какой именно.

Есть идеи, как этого добиться?Спасибо!

Ответы [ 3 ]

8 голосов
/ 21 сентября 2012

Если такая же пара (обращенная) существует, возьмите ту, где u> v.

SELECT DISTINCT u,v
FROM table t1 
WHERE t1.u > t1.v
    OR NOT EXISTS (
        SELECT * FROM table t2 
            WHERE t2.u = t1.v AND t2.v = t1.u 
    )
4 голосов
/ 11 января 2011

Это найдет все дубликаты:

SELECT t1.u, t1.v FROM table t1 INNER JOIN table t2
 ON t1.u = t2.v AND t1.v = t2.u

Это удалит дубликаты:

DELETE FROM table t1 WHERE
  EXISTS (SELECT * FROM table t2 WHERE t2.u = t1.v AND t2.v = t1.u AND t1.u > t2.u)

Обратите внимание, что это не удалит дубликаты, такие как (2, 2), но я думаю,Вы уже получили это с помощью SELECT DISTINCT.

0 голосов
/ 14 января 2018

- тестирование на 9 номеров, поэтому я добавляю 9 номеров в две таблицы

 declare @num  int
 set @num =1
 while @num<10
 begin 
 insert into t2 values (@num)
 insert into t1 values (@num)
 set @num +=  1 
 end

- затем объединяю уникальные символы без повторений

 select t1.u, t2.v
 from t1 cross join t2
 where t1.u>t2.v
...