2012-07-17 13 views
5

Eventuali duplicati:
Column does not exist in the IN clause, but SQL runsPerché questo codice SQL non genera un errore?

ho inciampato su questo oggi, mentre al lavoro oggi e mi chiedevo, perché è che il seguente codice non genera e l'errore?

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) 

uscita:

ColumnA 
1 
2 
3 

ColumnA non esiste #TableB, come mai non viene generato alcun errore?

@@ VERSION mi dice che corro questo:

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) 
+1

uso alias 'SELECT * FROM #TableA Un DOVE A.ColumnA IN (SELECT B.ColumnA FROM #TableB B)' e controllare gli errori –

+1

già risposto, vedi qui: http://stackoverflow.com/ questions/5076906/column-does-not-exist-in-the-in-clause-but-sql-runs –

risposta

10

ColumnA nella subquery (SELECT ColumnA FROM #TableB) si riferisce alla ColumnA di #TableA, che è una colonna valida nell'elenco SELECT.

Quindi non c'è nessun errore e si ottiene tre file in quanto si sta confrontando il # TableA.ColumnA con # TableA.ColumnA

Se si desidera verificare la dichiarazione di cui sopra sostituire ColumnA con qualsiasi cosa, ma diverso da una colonna valida (es. ColumnAB) si otterrà un errore.

Se si tenta questo:

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) 

l'uscita sarà

Msg 207, livello 16, stato 1, riga 14
valido nome di colonna 'ColumnAB'.

+4

Molto bello. Un altro modo per spiegarlo è che non vi è ovviamente alcun errore in "SELECT * FROM #TableA WHERE ColumnA IN (SELECT 42 FROM #TableB)'. Nel contesto della sottoquery, viene definita ColumnA, come 42, se non la risposta a tutto. –

+0

Mi sento stupido! Sei corretto al 100%, l'ho fatto molte volte è solo che sono abituato a usare le colonne della query esterna nella clausola WHERE della query interna. Per esempio: 'SELECT * FROM t #table DOVE t.Id IN (SELECT MAX (tIn.Id) DA #table tIn DOVE tIn.Column = t.Column)' \t \t \t \t Per qualche strana ragione per cui l'ho visto in modo diverso. –

Problemi correlati