我有下表:
+-----+-----+
| 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 |
+-----+-----+
什么是最好的解决方案?
答案 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 消除重复项。