按 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 值的子集
我需要在单个查询中做的是:
- 如果过滤器为空,我需要获取集合中的所有元素(负过滤器)。
- 如果过滤器不为空,我需要获取 INNER JOIN,从而进行适当的过滤。
我不想在过滤器上区分 COUNT(*),而是利用 JOIN、UNION、INTERSECT 和 EXCEPT。
你会如何编写这样的查询?
这是使用 outer join
和 not 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 只有那些匹配...
我有这两个表:
CREATE TABLE set (
id INT PRIMARY KEY;
value TEXT NOT NULL
);
CREATE TABLE filter (
id INT PRIMARY KEY
);
集合 TABLE 包含一些与 id 相关的信息。现实中的一个非常大的集合。 过滤器 TABLE 应该像下面解释的过滤器一样工作。如果有的话,它将包含在集合 TABLE.
中找到的 id 值的子集我需要在单个查询中做的是:
- 如果过滤器为空,我需要获取集合中的所有元素(负过滤器)。
- 如果过滤器不为空,我需要获取 INNER JOIN,从而进行适当的过滤。
我不想在过滤器上区分 COUNT(*),而是利用 JOIN、UNION、INTERSECT 和 EXCEPT。
你会如何编写这样的查询?
这是使用 outer join
和 not 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 只有那些匹配...