如何避免在 many-to-many sql 模型中使用子查询进行排除?

How to avoid using a subquery for exclusion in a many-to-many sql model?

假设我们有一个包含具有多对多关系的帖子和标签的模型。

例如:

帖子 table

Id Title HtmlContent
1 Cat eating a cucumber ...
2 Chicken flying above a cucumber ...
3 Cucumber taking revenge ...

标签 table

Id Label
1 cat
2 chicken
3 vegetables
4 funny

PostsTags 关联 table

Id PostId TagId
1 1 1
1 1 3
1 1 4
2 2 2
2 2 3
2 2 4
3 3 1
3 3 3

昨天我的 objective 是为了找到 Posts 的数量,既不涉及猫又不有趣(即我不希望 PostsTags 1 或 4).

我提出的查询是这个:

select count(p.Id)
from posts p
where p.Id not in (
    select postid 
    from poststags 
    where TagId in (1, 4)
    group by postid
)

我想知道是否有一种方法可以在不执行任何子查询的情况下排除 many-to-many 关系中的帖子?

仅供参考,我使用的是 SQLite 数据库。

您可以使用聚合和 window 函数 COUNT():

SELECT DISTINCT COUNT(CASE WHEN SUM(tagid IN (1, 4)) = 0 THEN 1 END) OVER ()
FROM PostsTags
GROUP BY postid

或者,window 函数 SUM():

SELECT DISTINCT SUM(SUM(tagid IN (1, 4)) = 0) OVER ()
FROM PostsTags
GROUP BY postid

参见demo