我今天在工作时偶然发现了这一点,我想知道,为什么以下代码不会产生错误?
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)
答案 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”无效。