Sql server 2008 为什么此SQL代码不生成错误?
可能重复: 我今天在工作中偶然发现了这一点,我想知道,为什么下面的代码不会生成错误Sql server 2008 为什么此SQL代码不生成错误?,sql-server-2008,tsql,Sql Server 2008,Tsql,可能重复: 我今天在工作中偶然发现了这一点,我想知道,为什么下面的代码不会生成错误 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
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)
输出:
表格B上不存在ColumnA,为什么不生成错误
@@版本告诉我,我正在运行以下程序:
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从表B中选择ColumnA
指TableA的列a,它是选择列表中的有效列
因此没有错误,因为您正在比较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,16级,状态1,第14行
列名称“ColumnAB”无效
使用别名SELECT*FROM table A其中A.ColumnA插入从table B中选择B.ColumnA并检查错误准备回答,请参见此处:非常好。另一种解释方法是,从表A中选择*显然没有错误,其中从表B中选择42中的列A。在子查询的上下文中,ColumnA(如42)被定义,如果不是所有问题的答案的话。我觉得自己很笨!你是100%正确的,我已经做过很多次了,只是我习惯于在内部查询的WHERE子句中使用外部查询中的列。例如:从表t中选择*其中t.Id插入从表tIn中选择MAXtIn.Id,其中tIn.Column=t.Column出于某种奇怪的原因,我对此有不同的看法。
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)