2014-10-20 132 views
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)

+0

区分大小写的服务器? – 2014-10-20 02:39:09

+1

这是设计;在任何地方都使用适当的表和列别名,并且不会发生。请参阅[连接#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

回答

0

试试这个 -

SELECT * FROM 表1 T1 WHERE t1.FieldA IN(SELECT t2.FIeldA FROM表2 T2)