【问题标题】:Postgres - Left Join, same tablePostgres - 左连接,同一张表
【发布时间】:2014-10-24 04:53:38
【问题描述】:

我有一个订阅组的人的订阅记录表。有一个 groupid 列和一个 userid 列(除了主键 id)。我想查找订阅组 1 且没有组 2 订阅记录的所有订阅行。我想我可以使用反加入模式,但我无法让它工作。我试过了:

SELECT
*
FROM subs s1
LEFT JOIN subs s2 ON s1.groupid=1 AND s2.groupid=2 AND s1.userid=s2.userid
WHERE s2.id IS NULL;

但这不起作用(它返回 groupid 不是 1 的订阅记录)。

【问题讨论】:

    标签: sql postgresql


    【解决方案1】:

    我会为此使用group by

    select s.userid
    from subs s
    group by s.userid
    having sum(case when s.groupid = 1 then 1 else 0 end) > 0 and
           sum(case when s.groupid = 2 then 1 else 0 end) = 0;
    

    having 子句中的每个条件都会计算其中一个组的记录。第一个条件表示至少有一行带有groupid = 1。第二个说没有groupid = 2的记录。

    可以使用left join 做您想做的事。方法如下:

    SELECT s1.*
    FROM subs s1 LEFT JOIN
         subs s2
         ON s1.userid = s2.userid AND s2.groupid = 2
    WHERE  s1.groupid = 1 AND s2.id IS NULL;
    

    因为是left join,所以第一个表的条件应该放在where子句中。

    【讨论】:

      猜你喜欢
      • 2023-04-04
      • 2021-12-03
      • 1970-01-01
      • 2012-02-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多