如何在 postgreSQL 中检查重复行 (a,b) ~ (b,a)
How to check for duplicate rows (a,b) ~ (b,a) in postgreSQL
假设我有两个表(ids1、ids2,列分别为 headers 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。
SELECT LEAST(id1,id2),GREATEST(id1,id2) FROM t
GROUP by
GREATEST(id1,id2),LEAST(id1,id2)
这可能不是最优雅的解决方案,但它会起作用:
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))
);
联接中的大于条件确保不会删除两个匹配的行。
假设我有两个表(ids1、ids2,列分别为 headers 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。
SELECT LEAST(id1,id2),GREATEST(id1,id2) FROM t
GROUP by
GREATEST(id1,id2),LEAST(id1,id2)
这可能不是最优雅的解决方案,但它会起作用:
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))
);
联接中的大于条件确保不会删除两个匹配的行。