这个where子句如何工作?

时间:2017-07-20 00:41:16

标签: sql join set set-theory

我发现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?

1 个答案:

答案 0 :(得分:1)

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

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

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