按 JOIN、UNION、INTERSECT、EXCEPT 过滤

Filtering by JOIN, UNION, INTERSECT, EXCEPT

我有这两个表:

CREATE TABLE set (
  id INT PRIMARY KEY;
  value TEXT NOT NULL
);

CREATE TABLE filter (
  id INT PRIMARY KEY
);

集合 TABLE 包含一些与 id 相关的信息。现实中的一个非常大的集合。 过滤器 TABLE 应该像下面解释的过滤器一样工作。如果有的话,它将包含在集合 TABLE.

中找到的 id 值的子集

我需要在单个查询中做的是:

  1. 如果过滤器为空,我需要获取集合中的所有元素(负过滤器)。
  2. 如果过滤器不为空,我需要获取 INNER JOIN,从而进行适当的过滤。

我不想在过滤器上区分 COUNT(*),而是利用 JOIN、UNION、INTERSECT 和 EXCEPT。

你会如何编写这样的查询?

这是使用 outer joinnot exists 的一种方法:

select s.id, s.value
from set s
    left join filter on s.id = filter.id 
where not exists (select 1 from filter) or s.id = filter.id 

这有点违反直觉 -- 但基本上,如果过滤器 table 中不存在记录,则 return 全部。否则,return 只有那些匹配...