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

时间:2012-07-17 18:28:32

标签: sql-server-2008 tsql

  

可能重复:
  Column does not exist in the IN clause, but SQL runs

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

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)

输出:

ColumnA
1
2
3

#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) 

1 个答案:

答案 0 :(得分:10)

子查询ColumnA中的

(SELECT ColumnA FROM #TableB) 引用#TableA的ColumnA,它是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)

输出将是

  

Msg 207,Level 16,State 1,Line 14
  列名称“ColumnAB”无效。