我有如下查询:
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/