sql >> Base de Datos >  >> RDS >> Sqlserver

La columna no existe en la cláusula IN, pero se ejecuta SQL

Esto funcionará si una tabla en el exterior la consulta tiene una columna con ese nombre. Esto se debe a que los nombres de las columnas de la consulta externa están disponibles para la subconsulta, y es posible que tenga la intención deliberada de seleccionar una columna de consulta externa en la lista SELECCIONAR de la subconsulta.

Por ejemplo:

CREATE TABLE #test_main (colA integer) 
CREATE TABLE #test_sub (colB integer)

-- Works, because colA is available to the sub-query from the outer query. However,
-- it's probably not what you intended to do:
SELECT * FROM #test_main WHERE colA IN (SELECT colA FROM #test_sub)

-- Doesn't work, because colC is nowhere in either query
SELECT * FROM #test_main WHERE colA IN (SELECT colC FROM #test_sub)

Como observa Damien, la forma más segura de protegerse de este "te pillé" no muy obvio es adquirir el hábito de calificar los nombres de las columnas en la subconsulta:

-- Doesn't work, because colA is not in table #test_sub, so at least you get
-- notified that what you were trying to do doesn't make sense.
SELECT * FROM #test_main WHERE colA IN (SELECT #test_sub.colA FROM #test_sub)