我有以下数据结构,其中包含节点之间的关系。 relationships
表有一个 from_id
和 to_id
,其中的值可以交换。
我只需要查找并删除重复项,留下每对的一行。
| id | node_from_id | node_to_id |
---------------------------------
| 1 | 100 | 200 |
| 2 | 200 | 100 |
| 3 | 200 | 300 |
| 4 | 300 | 200 |
| 5 | 200 | 300 |
| 6 | 300 | 400 |
| 7 | 500 | 400 |
删除重复项后,我希望以下内容保留在表中
| id | node_from_id | node_to_id |
---------------------------------
| 1 | 100 | 200 |
| 3 | 200 | 300 |
| 6 | 300 | 400 |
| 7 | 500 | 400 |
我能够相对简单地返回所有匹配的行,但为了使它们能够被删除,我只想返回实际的重复项以允许保留 key 对行之一。
这是我的查询,当前返回所有匹配行
SELECT *
FROM relationships AS rel1
WHERE EXISTS (SELECT *
FROM relationships AS rel2
WHERE
rel1.id <> rel2.id
AND
(
(
rel1.from_id = rel2.from_id AND
rel1.to_id = rel2.to_id
)
OR
(
rel1.from_id = rel2.to_id AND
rel1.to_id = rel2.from_id
)
)
)
我认为我可以使用窗口函数并仅选择 row_number() > 1
的行,但我似乎无法在 EXISTS 子查询中使用它。
我已经为关系
制作了实际数据available as CSV如果有帮助的话
最佳答案
我会使用类似的东西
select min(id),
least (node_from_id, node_to_id) node_from_id,
greatest(node_from_id, node_to_id) node_to_id
from relationships
group by
least (node_from_id, node_to_id) ,
greatest(node_from_id, node_to_id)
关于sql - 查找并删除可以在两列之间交换值的重复条目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39534698/