【问题标题】:Filtering by JOIN, UNION, INTERSECT, EXCEPT按 JOIN、UNION、INTERSECT、EXCEPT 过滤
【发布时间】:2015-03-11 15:29:19
【问题描述】:

我有这两张表:

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。

您将如何编写这样的查询?

【问题讨论】:

  • 为什么你更喜欢某些结构而不是其他结构?你能提供一些样本数据和想要的结果吗?
  • 您是否尝试过使用左外连接?
  • 问题是关于单个查询。这就是为什么我需要避免使用 IF。
  • 您使用的是哪个 DBMS? Postgres?
  • @VB1,除非您使用过滤器上的 COUNT(*) 进行 IF 等效,否则这将不起作用。由于过滤器是集合的子集,因此 LOJ 将导致集合本身。

标签: sql join union


【解决方案1】:

这是使用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 

这有点违反直觉——但基本上,如果过滤表中不存在记录,则返回所有记录。否则,只返回那些匹配的......

【讨论】:

  • 这东西确实有效。不过,这是一个左连接。 “WHERE NOT EXISTS... OR”是我愿意避免的 IF 等效项。我希望避免它......
  • @enzo:左连接外连接
  • 对于你正在寻找的东西,你不会比这个答案做得更好
猜你喜欢
  • 2010-10-13
  • 1970-01-01
  • 2021-05-10
  • 1970-01-01
  • 2012-01-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多