Sql 带子查询的issue using IN子句

Sql 带子查询的issue using IN子句,sql,sql-server-2008,Sql,Sql Server 2008,我有以下疑问 SELECT COUNT(*) FROM Table1 WHERE Column1 IN (SELECT Column1 FROM Table2) 实际上,表2中没有名为Column1的列。 所以如果我们只执行子查询 SELECT Column1 FROM Table2 它将抛出错误-列名“Column1”无效 但是如果我执行完整的查询,我不会得到任何错误。它正在返回表1中的总行数 所以我想知道为什么这个查询在这种情况下没有给出任何错误,以及in子句在这种情况下的工作

我有以下疑问

SELECT COUNT(*) 
FROM Table1 
WHERE Column1 IN
(SELECT  Column1 FROM Table2)
实际上,表2中没有名为Column1的列。 所以如果我们只执行子查询

 SELECT  Column1 FROM Table2
它将抛出错误-列名“Column1”无效

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


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

返回的计数是来自
表1
而不是
表2
的结果。如果您查看执行计划,您可以看到它对查询使用了
左半联接
,因此,如果它不能在列上联接,我假设将执行以下查询:

SELECT COUNT(*) 
FROM Table1 

这就是为什么查询仍然有效并返回相同的输出。

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

SELECT COUNT(*) 
FROM Table1 
WHERE Column1 IN
(SELECT  Column1 FROM Table2)
也可以写成:

SELECT COUNT(*) 
FROM Table1 
WHERE Column1 IN
(SELECT Table1.Column1 FROM Table2)
如果
Table2
中至少有一行,子查询将始终从
Table1
返回
Column1
值,并且()中的
将成功

这是我通常建议使用别名的一个原因:

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

如果
表2中没有
列1
,则将产生错误-或者,如果在子查询中引用
t1
,则更明显的是,这是故意的。

显示
表1
表2
的数据结构。谢谢@Damien\u不信者