SQL Server 2008 Management Studio no verifica la sintaxis de mi consulta
Como siempre, habrá una explicación razonable para mi sorpresa, pero hasta entonces….
tengo esta consulta
delete from Photo where hs_id in (select hs_id from HotelSupplier where id = 142)
que se ejecuta muy bien (luego descubrí que toda la tabla de fotos estaba vacía)
pero lo extraño: no hay ningún campo hs_id
en HotelSupplier, se llama hs_key
!
Entonces cuando ejecuto la última parte
select hs_id from HotelSupplier where id = 142
por separado (seleccione esa parte de la consulta con el mouse y presione F5), aparece un error, pero cuando lo uso en la in
cláusula, ¡no aparece!
Me pregunto si este es un comportamiento normal.
Está tomando el valor de hs_id
la consulta externa.
Es perfectamente válido tener una consulta que no proyecte ninguna columna de la tabla seleccionada en su select
lista.
Por ejemplo
select 10 from HotelSupplier where id = 142
devolvería un conjunto de resultados con tantas filas como coincidan con la where
cláusula y el valor 10
de todas las filas.
Las referencias de columnas no calificadas se resuelven desde el alcance más cercano hacia afuera, por lo que esto se trata simplemente como una subconsulta correlacionada.
El resultado de esta consulta será eliminar todas las filas donde Photo
no hs_id
sea nulo siempre que HotelSupplier tenga al menos una fila donde id = 142 (y por lo tanto la subconsulta devuelva al menos una fila)
Podría ser un poco más claro si consideras cuál es el efecto de esto.
delete from Photo where Photo.hs_id in (select Photo.hs_id)
Por supuesto, esto es equivalente a
delete from Photo where Photo.hs_id = Photo.hs_id
Por cierto, este es de lejos el "error" más común que personalmente he visto reportado erróneamente en Microsoft Connect. Erland Sommarskog lo incluye en su lista de deseos paraSET STRICT_CHECKS ON
Es un argumento sólido para mantener la coherencia de los nombres de las columnas entre las tablas. Como dice @Martin, la sintaxis SQL permite que los nombres de las columnas se resuelvan a partir de la consulta externa, cuando no hay coincidencias en la consulta interna. Esto es una gran ayuda al escribir subconsultas correlacionadas, pero a veces puede hacerte tropezar (como aquí)