sql - 跨多个列删除具有重复值的行

标签 sql postgresql

我有如下查询:

SELECT
    c.id, 
c.user,
c1.user,
c2.user
FROM (
    SELECT 
    id,
    user
    FROM 
        table_x
) c
INNER JOIN table_x c1 ON c.id = c1_id AND c.user = 'steve'
INNER JOIN table_x c2 ON c.id = c2.id AND c1.user = 'rob'
INNER JOIN table_x c3 ON c.id = c3.id AND c2.user LIKE 'r%'
GROUP BY c.id, c.user, c1.user, c2.user

它可以产生如下结果集:

id | user | user | user
1    steve  rob    rob52
1    steve  rob    rob

我需要结果集不包含跨两列的用户不唯一的第二行。有没有一种方法可以在不使用 where 子句检查每个单独的列组合的情况下进行检查?因为当结果集跨越 6 列之类的东西时,要检查的东西太多了。

结果集也可能返回为:

id | user | user | user
1    rob    steve  rob

所以与 <> 进行比较或 !=连接时的运算符不会捕获这样的行,但可以捕获上述结果集中的第 2 行。

谢谢

最佳答案

你可以使用 distinct on

SELECT DISTINCT ON (c.id, c.user, c1.user)
    c.id, 
c.user,
c1.user,
c2.user
FROM (
    SELECT 
    id,
    user
    FROM 
        table_x
) c
INNER JOIN table_x c1 ON c.id = c1_id AND c.user = 'steve'
INNER JOIN table_x c2 ON c.id = c2.id AND c1.user = 'rob'
INNER JOIN table_x c3 ON c.id = c3.id AND c2.user LIKE 'r%'
GROUP BY c.id, c.user, c1.user, c2.user

这样,对于 distinct on 子句中提到的列的每个不同组合,您只会获得 1 条记录

关于sql - 跨多个列删除具有重复值的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19411879/

相关文章:

mysql - 如何检查mysql中的触发器是否存在行?

php - 2 连接 MYSQL 并限制 1

postgresql - 在 PostgreSQL 中创建序列时出错

sql - 选择除某些 PostgreSQL 之外的所有列

PHP-Laravel : How to save without time overlapping in DB

sql - 将查询转换为SQL Server语法

mysql - 将数据插入其主键由 2 列组合的表

postgresql - PostgreSQL 中数据类型的大写/小写是否有最佳实践

java - 将 java 对象保存到 PostgreSQL

postgresql - 在 Postgres 中按天分组