这个问题已经在这里有了答案:




已关闭8年。






我今天在工作时偶然发现了这个,我想知道为什么下面的代码不会生成并出错?

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

ColumnA在#TableB上不存在,为什么不产生错误?

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

最佳答案

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

因此,没有错误,并且由于将#TableA.ColumnA与#TableA.ColumnA进行比较而获得了三行

如果要验证上述语句,请使用有效列(例如ColumnAB)以外的任何内容替换ColumnA,否则会出现错误。

如果您尝试这样做:

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)

输出将是

关于sql-server-2008 - 为什么此SQL代码不会产生错误?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11528612/

10-15 03:08