sql - 查找并删除可以在两列之间交换值的重复条目

标签 sql postgresql

我有以下数据结构,其中包含节点之间的关系。 relationships 表有一个 from_idto_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/

相关文章:

sql - 如何将sql查询结果转换为csv格式

postgresql - 将 RDS 连接到 Quicksight 抛出 `GENERIC_SQL_EXCEPTION`

postgresql - 来自 Postgres 数据的完整 XML 文档

MySQL 数据库() 与数据库名称

java - 为什么请求无效转换错误代码 : 17132?

php - 正确检查 MySQLi OOP 错误

ruby-on-rails - Rails Postgis 升级问题

php - 当数据库发生变化时自动更改 html 项目

sql - 在 PostgreSql 的 jsonb 中没有键的嵌套搜索

xml - 试图从 psql 查询中保存 xml 文件?