如何检查postgreSQL中的重复行(a,b)〜(b,a)

时间:2015-08-03 20:06:22

标签: postgresql postgresql-9.2

假设我有两个表(ids1,ids2,列标题分别为id1,id2)

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

如何删除(a,b)〜(b,a)行以便我得到

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

我是否得到(1,3)(2,4),(3,1)(4,2)或两者的组合并不重要。

我正在使用postgreSQL-9.2。

2 个答案:

答案 0 :(得分:1)

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

FIDDLE

答案 1 :(得分: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))
);

连接中的grater than条件确保不会删除两个匹配的行。