0

我有以下查询

SELECT COUNT(*) 
FROM Table1 
WHERE Column1 IN
(SELECT  Column1 FROM Table2)

实际上,Table2 中没有名为 Column1 的列。所以如果我们只执行子查询

 SELECT  Column1 FROM Table2

它会抛出错误 - 列名“Column1”无效。

但是,如果我执行完整的查询,我不会收到任何错误。它正在返回表 1 中的总行数。

所以我想知道这个查询在这种情况下没有给出任何错误的原因以及 IN 子句在这种情况下的工作方式。

4

2 回答 2

2

在子查询中,您可以访问外部查询中的列。这就是这里发生的事情:

SELECT COUNT(*) 
FROM Table1 
WHERE Column1 IN
(SELECT  Column1 FROM Table2)

也可以写成:

SELECT COUNT(*) 
FROM Table1 
WHERE Column1 IN
(SELECT Table1.Column1 FROM Table2)

如果 中至少有一行Table2,则子查询将始终返回Column1from 的值Table1,并且IN()会成功。

这是我通常推荐使用别名的原因之一:

SELECT COUNT(*) 
FROM Table1 t1
WHERE t1.Column1 IN
(SELECT t2.Column1 FROM Table2 t2)

如果没有Column1in将产生错误Table2- 或者,如果您子查询中引用t1,则更明显的是它是故意的。

于 2012-10-10T12:38:08.663 回答
0

返回的计数是Table1not的结果Table2。如果您查看执行计划,您会发现它使用 aLEFT SEMI JOIN进行查询,因此如果它无法加入列,我假设将执行以下查询:

SELECT COUNT(*) 
FROM Table1 

这就是查询仍然有效并返回相同输出的原因。

于 2012-10-10T11:14:25.083 回答