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不信者