PostgreSQL-消除重复的条目

时间:2018-09-20 07:35:54

标签: sql postgresql-9.6

我有下表:

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

我不想得到重复的条目,例如

1 | 2
2 | 1

最后我需要遵循以下条件:

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

什么是最好的解决方案?

3 个答案:

答案 0 :(得分:1)

那呢:

DELETE FROM table WHERE (id1, id2) IN 
(SELECT t1.id1, t1.id2 FROM table t1 INNER JOIN table t2 ON t1.id1 = t2.id2 AND t1.id2 = t2.id1);

编辑:

哦,我想您想同时删除它们。

DELETE FROM table WHERE (id1, id2) NOT IN(
SELECT least(id1, id2), greatest(id1, id2)
FROM table);

SELECT DISTINCT least(id1, id2), greatest(id1, id2)
FROM table

答案 1 :(得分:1)

如果每对最多可以有两个条目,则:

select id1, id2
from t
where id1 < id2
union all
select id1, id2
from t
where id2 > id1 and
      not exists (select 1 from t t2 where t2.id1 = t.id2 and t2.id2 = t.id1);

如果您只想要唯一对,则可以使用least()greatest()

select least(id1, id2), greatest(id1, id2)
from t
group by least(id1, id2), greatest(id1, id2);

编辑:

您还可以使用窗口函数或distinct on来完成此操作:

select distinct on (least(id1, id2), greatest(id1, id2)) t.*
from t
order by least(id1, id2), greatest(id1, id2);

答案 2 :(得分:0)

我自己找到了解决方案。我想我的问题措辞不好。

SELECT DISTINCT
    CASE WHEN u.id1 > u.id2 THEN u.id2
        ELSE u.id1
    END as id1,
    CASE WHEN u.id1 < u.id2 THEN u.id2
        ELSE u.id1
    END as id2
FROM table u

我将较小的值排序到左侧。
DISTINCT 消除重复项。