首页 > 解决方案 > 选择sql中不反向重复的记录

问题描述

假设我们有一个包含两列用户对的简单表:user1 和 user2。此外,假设一些对出现两次(以相反的顺序),而另一些则没有。因此,例如,对 (1,2) 出现在 (user1=1 and user2=2) 的记录和 (user1=2 and user2=1) 的另一记录中,而对 (1,3) 出现仅作为(user1=1 和 user2=3)一次。

我想编写一个返回所有对但不包括重复项的查询,这意味着返回的查询每对只出现一次。因此,对于上面的示例,对 (1,2) 应仅显示为 (user1=1 and user2=2) 或 (user1=2 and user2=1),但不能同时显示。

在 postgre sql 中实现这一目标的最简单方法是什么?

标签: mysqlsqlpostgresql

解决方案


一个简单的方法是:

select user1, user2
from t
where user1 < user2 or
      not exists (select 1
                  from t t2
                  where t2.user1 = t1.user2 and t2.user2 = t1.user1
                 );

第一个条件返回所有行user1 < user2。第二个返回只有一对的所有行 - 但因为这都是相同的where,所以满足第一个条件的一对只返回一次。


推荐阅读