Postgres - Left Join,同桌

时间:2014-10-24 04:53:38

标签: 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的订阅记录)。

1 个答案:

答案 0 :(得分:3)

我会使用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子句中。