sql - 从 SQL 连接中删除镜像对

标签 sql relational-database

我有一个包含 2 个字段(名称、兴趣)的表,我想找到所有具有相同兴趣的对,并删除所有重复项和镜像对。

我可以使用以下 SQL 语句找到所有对并删除重复项:

SELECT P1.name AS name1, P2.name AS name2, P1.interest 
FROM Table AS P1, Table AS P2
WHERE P1.interest = P2.interest AND P1.name <> P2.name;

但我不确定如何删除镜像对,即:
"wil","ben","databases""ben","wil","databases"
我尝试将上述语句设为名为 Matches 的 View ,并尝试执行以下查询:
SELECT * FROM Matches
WHERE name2 <> (select name1 from Matches);

但它不会删除所有镜像对。

最佳答案

假设您不关心哪一对最终会坚持 (ben,will) vs (will, ben),那么我的首选解决方案是执行以下操作:

DELETE p2 
FROM Pairs p1 
INNER JOIN Pairs p2 
    on p1.Name1 = p2.Name2 
    and p1.Name2 = p2.Name1 
    and p1.Interest = p2.Interest
    -- match only one of the two pairs
    and p1.Name1 > p1.Name2

由于您永远不会让 Name1 和 Name2 相等,因此必须始终存在一对,其中第一个成员小于第二个成员。使用这种关系,我们可以删除重复项。

如果您有关系的代理键,这尤其微不足道,因为 Name1 和 Name2 不相等的要求就消失了。

编辑: 如果您不想将它们从表中删除,而只是从特定查询的结果中删除,请对 SELECT 而不是 DELETE 使用相同的模式。

关于sql - 从 SQL 连接中删除镜像对,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15104744/

相关文章:

mysql - 将一个表的每一列作为一行插入到另一个表中

具有 OR 的 SQL 查询比 2 个单独的查询慢得多

ruby-on-rails - 日志数据分析 : Choice of Database

mysql - SQL - 从 JOIN 查询中选择不同的 AND 计数

mysql - 如何使用 Spring Boot 从属性文件中获取静态最终属性

database - 如何从 Sequelize 中的实例中排除关联属于多?

mysql - 添加外键时如何知道引用表的删除 Action

database - 在关系型数据库中,不鼓励将同一条数据保存在两个地方吗?

mysql - 添加一个 where 约束来选择不同的

mysql - MySQL 命令的奇怪行为 NOT IN | GROUP_CONCAT?