SQL Server 2008 Management Studio no verifica la sintaxis de mi consulta

Resuelto Michel asked hace 13 años • 2 respuestas

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_iden 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 incláusula, ¡no aparece!

Me pregunto si este es un comportamiento normal.

Michel avatar Jan 04 '11 21:01 Michel
Aceptado

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 selectlista.

Por ejemplo

select 10 from HotelSupplier where id = 142

devolvería un conjunto de resultados con tantas filas como coincidan con la wherecláusula y el valor 10de 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 Photono hs_idsea 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

Martin Smith avatar Jan 04 '2011 14:01 Martin Smith

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

Damien_The_Unbeliever avatar Jan 04 '2011 14:01 Damien_The_Unbeliever