SQL Server在子查询中使用IN运算符似乎是一个错误?

SQL Server在子查询中使用IN运算符似乎是一个错误?,sql,sql-server,sql-server-2017,Sql,Sql Server,Sql Server 2017,上述3条SQL语句在SQL Server 2008-2017中运行正常。因为f1没有前缀tablex,也不在tablex中,它绑定到f1来自table1。当然table1.f1在(table1.f1)中 这不是bug,这是SQL中绑定的工作方式。见: (…)如果子查询的FROM子句中引用的表中不存在列,则该列由外部查询的FROM子句中引用的表隐式限定。(……) 这是一个很好的例子,说明为什么养成总是限定列的习惯是有用的——至少在涉及多个表(通过子查询、联接等)时是如此。试一试 你会得到你期望的错

上述3条SQL语句在SQL Server 2008-2017中运行正常。

因为
f1
没有前缀
tablex
,也不在
tablex
中,它绑定到
f1
来自
table1
。当然
table1.f1
(table1.f1)

这不是bug,这是SQL中绑定的工作方式。见:

(…)如果子查询的FROM子句中引用的表中不存在列,则该列由外部查询的FROM子句中引用的表隐式限定。(……)

这是一个很好的例子,说明为什么养成总是限定列的习惯是有用的——至少在涉及多个表(通过子查询、联接等)时是如此。试一试

你会得到你期望的错误

还可以使用表别名缩短限定列,如中所示:

... in (select tablex.f1 from tablex)

由于
f1
没有前缀
tablex
,并且不在
tablex
中,因此它绑定到
f1
来自
table1
。当然
table1.f1
(table1.f1)

这不是bug,这是SQL中绑定的工作方式。见:

(…)如果子查询的FROM子句中引用的表中不存在列,则该列由外部查询的FROM子句中引用的表隐式限定。(……)

这是一个很好的例子,说明为什么养成总是限定列的习惯是有用的——至少在涉及多个表(通过子查询、联接等)时是如此。试一试

你会得到你期望的错误

还可以使用表别名缩短限定列,如中所示:

... in (select tablex.f1 from tablex)

非常感谢你的回答。有没有官方的在线文件解释这种现象。@Ginger:看编辑。你太棒了!非常感谢。ヽ(°◇° )ノ !@Ginger请将此标记为已接受的答案,以帮助未来的访客。@PratikBhavsar OK:-)非常感谢您的回答。有没有官方的在线文件解释这种现象。@Ginger:看编辑。你太棒了!非常感谢。ヽ(°◇° )ノ !@Ginger请将此标记为已接受的答案,以帮助未来的访问者。@PratikBhavsar OK:-)
... in (select x.f1 from tablex x)