2015-08-03 1 views
0

Say У меня есть две таблицы (idS1, ids2 с колонкой заголовками ID1, ID2 соответственно)Как проверить наличие дубликатов строк (а, б) ~ (Ь, а) в PostGreSQL

+-----+----+ 
| id1 | id2| 
+-----+----+ 
| 1 | 3 | 
| 2 | 4 | 
| 3 | 1 | 
| 4 | 2 | 
| 5 | 0 | 
+--------+ 

Как удалить (а, б) ~ (Ь, а) строки, так что я получаю

+-----+----+ 
| id1 | id2| 
+-----+----+ 
| 1 | 3 | 
| 2 | 4 | 
| 5 | 0 |  
-----------+ 

не имеет значения, получаю ли я (1,3) (2,4), (3,1) (4 , 2) или комбинацию из двух.

Я использую postgreSQL-9.2.

ответ

1
SELECT LEAST(id1,id2),GREATEST(id1,id2) FROM t 
GROUP by 
GREATEST(id1,id2),LEAST(id1,id2) 

FIDDLE

0

Это может быть не самый элегантный из решений, но он будет работать:

DELETE FROM foo 
WHERE (id1, id2) in (
SELECT f1.id1, f1.id2 
    FROM foo f1 
    JOIN foo f2 ON (
     f1.id1 = f2.id2 AND 
     f1.id2 = f2.id1 AND 
     (f1.id1, f1.id2) > (f2.id1, f2.id2)) 
); 

терке, чем условие в соединении убеждается, чтобы не удалить оба совпадающие строки.

Смежные вопросы