通过JOIN,UNION,INTERSECT过滤,除外

时间:2015-03-11 15:29:20

标签: sql join union

我有这两个表:

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

CREATE TABLE filter (
  id INT PRIMARY KEY
);

set TABLE包含一些与id绑定的信息。在现实中的一个非常大的集合。 过滤器TABLE应该像过滤器一样,如下所述。如果有的话,它将包含在集合TABLE中找到的id值的子集。

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

  1. 如果过滤器为空,我需要获取集合中的所有元素(负过滤器)。
  2. 如果过滤器不为空,我需要获取INNER JOIN,因此需要进行适当的过滤。
  3. 我不想在过滤器上区分COUNT(*),而是利用JOIN,UNION,INTERSECT和EXCEPT。

    你会怎么写这样的查询?

1 个答案:

答案 0 :(得分:2)

以下是使用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 

这有点反直觉 - 但基本上,如果过滤表中没有记录,则返回all。否则,只返回那些匹配......