0
在故障排除查询时偶然发现此错误,我有一个基本的SELECT语句,它具有WHERE IN()语句。 现在子查询本身试图从不存在字段的表中选择一个字段。如果您自己运行子查询,则会得到您期望的'不正确的语法',如果您运行它执行的整个查询并返回结果。任何人都可以解释这是如何执行的,因为对我来说它根本就没有意义。语法不正确的子查询仍然返回结果
所以两个基本表
CREATE TABLE Table1
(
FieldA int
, FieldB int
)
CREATE TABLE Table2
(
FIeldC int
, fieldD int
)
INSERT INTO Table1
VALUES (1,1)
,(1,2)
,(1,3)
INSERT INTO Table2
VALUES (2,1)
,(2,2)
,(2,3)
现在,这个查询将失败(这是有道理的有表2中没有FIELDA)
SELECT FIeldA FROM Table2
消息207,级别16,状态1,第1行 列名称'FIELDA'无效。
然而,不知何故该查询不会失败,执行并返回结果
SELECT * FROM TAble1
WHERE FieldA IN (SELECT FIeldA FROM Table2)
它返回所有记录从表1
将其更改为这个
SELECT * FROM TAble1
WHERE FieldB IN (SELECT FIeldA FROM Table2)
只返回的第一个结果来自表1
在Microsoft SQL Server上尝试过2008 R2(RTM),以及如Microsoft SQL Server 2012(SP1)
区分大小写的服务器? – 2014-10-20 02:39:09
这是设计;在任何地方都使用适当的表和列别名,并且不会发生。请参阅[连接#302281](http://connect.microsoft.com/SQLServer/feedback/details/302281),[连接#735178](http://connect.microsoft.com/SQLServer/feedback/details/735178/ ),[Connect#772612](http://connect.microsoft.com/SQLServer/feedback/details/772612/),[Connect#265772](http://connect.microsoft.com/SQLServer/feedback/details/ 265772 /),[KB#298674](http://support.microsoft.com/kb/298674),[相关子查询(MSDN)](http://msdn2.microsoft.com/en-us/library/ms187638 .aspx)等。 – 2014-10-20 03:10:54