5

可能重复:
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)

输出:

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

1 回答 1

10

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

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

如果您想验证上述语句,请将 ColumnA 替换为除有效列(例如 ColumnAB)以外的任何内容(例如 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)

输出将是

消息 207,级别 16,状态 1,第 14 行
无效的列名“ColumnAB”。

于 2012-07-17T18:31:55.817 回答