为什么这个SQL代码不会生成错误?

5 t-sql sql-server-2008

可能重复:
IN子句中不存在列,但SQL运行

我今天在工作时偶然发现了这一点,我想知道,为什么以下代码不生成和错误?

CREATE TABLE #TableA (ColumnA VARCHAR(25))
CREATE TABLE #TableB (ColumnB VARCHAR(25))

INSERT INTO #TableA (ColumnA) VALUES('1')
INSERT INTO #TableA (ColumnA) VALUES('2')
INSERT INTO #TableA (ColumnA) VALUES('3')

INSERT INTO #TableB (ColumnB) VALUES('1')

SELECT *
FROM #TableA
WHERE ColumnA IN(SELECT ColumnA FROM #TableB)
Run Code Online (Sandbox Code Playgroud)

输出:

ColumnA
1
2
3
Run Code Online (Sandbox Code Playgroud)

#TableB上不存在ColumnA,怎么没有生成错误?

@@ VERSION告诉我我正在运行:

Microsoft SQL Server 2008 (RTM) - 10.0.1600.22 (X64)   Jul  9 2008 14:17:44   Copyright (c) 1988-2008 Microsoft Corporation  Enterprise Edition (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1) (VM) 
Run Code Online (Sandbox Code Playgroud)

Cha*_*ndu 10

ColumnA在子查询中(SELECT ColumnA FROM #TableB) 引用ColumnA#TableA,它是SELECT列表中的有效列.

因此,没有错误,因为您将#TableA.ColumnA与#TableA.ColumnA进行比较,您会得到三行

如果要验证上述语句,请将ColumnA替换为除有效列以外的任何内容(例如ColumnAB),您将收到错误消息.

如果你试试这个:

CREATE TABLE #TableA (ColumnA VARCHAR(25))
CREATE TABLE #TableB (ColumnB VARCHAR(25))

INSERT INTO #TableA (ColumnA) VALUES('1')
INSERT INTO #TableA (ColumnA) VALUES('2')
INSERT INTO #TableA (ColumnA) VALUES('3')

INSERT INTO #TableB (ColumnB) VALUES('1')

SELECT *
FROM #TableA
WHERE ColumnA IN(SELECT ColumnAB FROM #TableB)
Run Code Online (Sandbox Code Playgroud)

输出将是

消息207,级别16,状态1,行14
无效的列名称"ColumnAB".

  • 非常好.解释它的另一种方法是`SELECT*FROM #TableA WHERE ColumnA IN(SELECT 42 FROM #TableB)`中显然没有错误.在子查询的上下文中,ColumnA(如42)被定义,如果不是所有内容的答案. (4认同)