以下 SQL 查询的结果是啥?

Posted

技术标签:

【中文标题】以下 SQL 查询的结果是啥?【英文标题】:What is the result of following SQL Query?以下 SQL 查询的结果是什么? 【发布时间】:2020-05-15 04:32:05 【问题描述】:

SQL 查询

 SELECT columns 
 FROM TableA RIGHT OUTER JOIN 
      TableB 
      ON A.columnName = B.columnName 
 WHERE A.columnName IS NULL

返回以下内容:

(a) 表B中满足上述相等条件的所有行,表A中没有满足条件的行

(b) 表A中所有满足上述相等条件的行,表B中没有满足条件的行

(c) 表B中满足相等条件的所有行

(d) 表A中满足相等条件的所有行

答案应该是什么?

【问题讨论】:

这就是所谓的“反加入”。 你为什么不谷歌右外连接,或者更好的是,使用 sql fiddle 之类的网站构建一个测试数据集,看看你编写该脚本时会发生什么。 只需创建表,插入一些数据,看看会发生什么! 这是一道作业题吗?如果是这样,您应该尝试自己解决,然后询问您遇到的具体问题。 (见point 3 here) 提示:所有选项 a、b、c 和 d 都是错误的。 【参考方案1】:

答案 (b) 和 (d) 完全错误。该查询不会从 TableA 返回任何行。

如果在 TableA 中找到任何匹配的行,则这些行将被 WHERE 子句中的条件排除。 (注意columnName 的任何满足 ON 子句中相等比较的值都将是非 NULL,并且该值将不满足 WHERE 子句中的“IS NULL”条件。)

答案(c)也是错误的。该查询将返回 TableB 中没有在 TableA 中找到匹配行的行。

错误最少的答案是 (a) ...但仍然是错误的,因为单词的选择没有准确地传达集合的定义。


查询是一个反连接模式。

查询定义了在 TableB 中找到的一组行,这些行在 TableA 中没有匹配的行。

另一种指定该集合的方法是使用带有相关子查询的 NOT EXISTS 条件:

 SELECT b.*
   FROM tableB b
  WHERE NOT EXISTS 
        ( SELECT 1
            FROM tableA a
           WHERE a.columnName = b.columnName )

【讨论】:

【参考方案2】:

所有显示的选项都是错误的。答案是:

e) TableB 中“columnName”值不存在于 TableA 中的所有行。

例子:

create table a (col int);
create table b (col int);

insert into a (col) values (null), (1), (2);
insert into b (col) values (null), (1), (3);

select a.col as a_col, b.col as b_col
from a 
right outer join b on a.col = b.col
where a.col is null

结果:

a_col   b_col
------  ------
<null>  <null>
<null>       3

【讨论】:

+10 反连接返回 b 中没有在 a 中找到匹配行的所有行

以上是关于以下 SQL 查询的结果是啥?的主要内容,如果未能解决你的问题,请参考以下文章

使用以下查询获得结果的最佳方法是啥

在 SQL Server(查询分析器)中的查询结果中识别隐藏字符的最佳方法是啥?

获得以下结果的优化查询可以是啥[关闭]

sql server将查询结果放入新表?

在 spark sql 中获取上一次特定月份的结果的最简单方法是啥?

在SELECT语句中,对查询结果进行排序的子句是啥?能消除重复行的关键字是啥?