Sql Postgres-左连接,同一个表

Sql Postgres-左连接,同一个表,sql,postgresql,Sql,Postgresql,我有一个订阅组用户的订阅记录表。有一个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)。我将使

我有一个订阅组用户的订阅记录表。有一个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)。

我将使用
groupby
实现这一点:

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
的记录

您也可以使用
左连接执行您想要的操作。方法如下:

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;
因为它是一个
左连接
,所以第一个表上的条件应该放在
where
子句中