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

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

1 に答える 1

10

ColumnAサブクエリのは、SELECTリストの有効な列である#TableAのを(SELECT ColumnA FROM #TableB) 参照します。ColumnA

したがって、エラーは発生せず、#TableA.ColumnAと#TableA.ColumnAを比較しているため、3つの行が表示されます。

上記のステートメントを検証する場合は、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)

出力は次のようになります

メッセージ207、レベル16、状態1、行14
無効な列名'ColumnAB'。

于 2012-07-17T18:31:55.817 に答える