【问题标题】:How does this where clause work?这个 where 子句是如何工作的?
【发布时间】:2017-07-20 00:41:15
【问题描述】:

我发现 this link 以视觉方式解释连接,有些东西引起了我的注意。

最后一个例子是这样说的:

To produce the set of records unique to Table A and Table B, 
we perform the same full outer join, then exclude the records 
we don't want from both sides via a where clause. 

full join - venn diagram

此示例的两个表包含以下内容:

id name       id  name
-- ----       --  ----
1  Pirate     1   Rutabaga
2  Monkey     2   Pirate
3  Ninja      3   Darth Vader
4  Spaghetti  4   Ninja

查询和结果:

SELECT * 
FROM TableA
FULL OUTER JOIN TableB ON TableA.name = TableB.name
WHERE TableA.id IS null
   OR TableB.id IS null

输出:

id    name       id    name
--    ----       --    ----
2     Monkey     null  null
4     Spaghetti  null  null
null  null       1     Rutabaga
null  null       3     Darth Vader

我不明白的是,where 子句如何在这些表上找到空 ID?

** WHERE TableA.id IS null
OR TableB.id IS null **

会不会是在完全连接发生后,在两个表的最终输出中插入了一堆空元组(正如完全连接所期望的那样),然后 where 子句会从其中获取它的空 ID?

【问题讨论】:

  • 不应该是IS NOT NULL吗?
  • 示例想要显示的内容是正确的,事实上,如果您构建这些表并执行此查询,查询确实会带来这些结果。我只需要了解where子句是如何找到空值的,当表中没有空值时,至少最初没有。

标签: sql join set set-theory


【解决方案1】:

外连接包括一个或两个表中的所有记录,即使没有匹配项。

特别是,即使on 子句的计算结果为非真,完全外连接也会返回每个表中的所有记录。另一个表中的列不是null。因此,您的查询会返回一个表中的记录,但不能同时返回。

请注意,这可能不是获取此信息的最佳方法,因为重复的连接键会增加记录的数量。

【讨论】:

  • 嗨,戈登,感谢您的回复。我了解查询是如何工作的,直到加入子句。之后,where 是在执行查询之前选择那些表中不存在的值。例如,如果您运行查询 > select * from tableA where tableA.id 为 null,则不会带来任何结果,因为 tableA 中没有 null ID。那么,在完全连接之后,where 子句如何能够找到该表中当前不存在的空值。引擎盖下的一些规则使这成为可能,我只是想了解它是如何工作的。
猜你喜欢
  • 1970-01-01
  • 2018-12-16
  • 2021-12-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-10
相关资源
最近更新 更多