2012-07-17 23 views
5

Duplicar posible:
Column does not exist in the IN clause, but SQL runs¿Por qué este código SQL no genera un error?

me encontré con este día de hoy, mientras que en el trabajo hoy y me preguntaba, ¿cómo es que el siguiente código no genera y error?

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) 

Salida:

ColumnA 
1 
2 
3 

ColumnA no existe en #TableB, ¿cómo es que no se genera ningún error?

@@ VERSION me dice que estoy quedando esto en:

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 de alias 'SELECT * DE #TableA Un DONDE A.ColumnA IN (SELECT B.ColumnA DE #TableB B)' y comprobar errores –

+1

ya ha respondido, ver aquí: http://stackoverflow.com/ preguntas/5076906/column-does-not-exist-in-the-in-clause-but-sql-runs –

Respuesta

10

ColumnA en la subconsulta (SELECT ColumnA FROM #TableB) se refiere a la ColumnA de #TableA que es una columna en la lista SELECT válida.

Por lo tanto no hay error y se obtiene tres filas, ya que está comparando el TableA.ColumnA # con # TableA.ColumnA

Si desea verificar la afirmación anterior reemplazar ColumnA con cualquier cosa pero aparte de una columna válida (ej. ColumnAB) obtendrá un error.

Si intenta esto:

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) 

la salida será

Msg 207, nivel 16, estado 1, línea 14
nombre de columna no válido 'ColumnAB'.

+4

Muy bueno. Otra forma de explicarlo es que obviamente no hay error en 'SELECT * FROM #TableA WHERE ColumnA IN (SELECT 42 FROM #TableB)'. En el contexto de la subconsulta, se define ColumnA, como 42, si no la respuesta a todo. –

+0

¡Me siento tonto! Estás 100% correcto, lo he hecho muchas veces, es solo que estoy acostumbrado a usar las columnas de la consulta externa en la cláusula WHERE de la consulta interna. Por ejemplo: 'SELECT * de T #Table DONDE t.Id IN (SELECT MAX (tIn.Id) DE #Table tIn DONDE tIn.Column = t.Column)' \t \t \t \t Para alguna extraña razón lo vi de manera diferente. –

Cuestiones relacionadas