语法不正确的子查询仍返回结果

时间:2014-10-20 02:33:35

标签: sql sql-server sql-server-2008

前几天偶然遇到这个问题,同时解决查询问题,我有一个基本的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

Msg 207,Level 16,State 1,Line 1 列名称无效' FIeldA'。

但不知何故,这个查询不会失败,执行并返回结果

SELECT * FROM TAble1
WHERE FieldA IN (SELECT FIeldA FROM Table2)

它返回了Table1

中的所有记录

将其更改为

SELECT * FROM TAble1
WHERE FieldB IN (SELECT FIeldA FROM Table2)

仅返回Table1的第一个结果

在Microsoft SQL Server 2008 R2(RTM)以及Microsoft SQL Server 2012(SP1)上尝试过此操作

1 个答案:

答案 0 :(得分:0)

试试这个 -

SELECT * 来自TAble1 t1 在哪里t1.FieldA IN(SELECT t2.FIeldA                      来自表2 t2)