SQL Server 2008 Management Studio non controlla la syntax della mia query

Come sempre, ci sarà una spiegazione ragionevole per la mia sorpresa, ma fino ad allora ….

Ho questa domanda

delete from Photo where hs_id in (select hs_id from HotelSupplier where id = 142) 

che funziona bene (più tardi ho scoperto che l’intero tavolo fotografico era vuoto)

ma la cosa strana: non c’è campo hs_id in hs_id , si chiama hs_key !

Quindi quando eseguo l’ultima parte

 select hs_id from HotelSupplier where id = 142 

separatamente (seleziona quella parte della query con il mouse e premi F5), ricevo un errore, ma quando lo uso in clausola in, no!

Mi chiedo se questo è un comportamento normale?

Sta prendendo il valore di hs_id dalla query esterna.

I riferimenti di colonna non qualificati vengono risolti dall’ambito più esterno verso l’esterno in modo che questo venga trattato come una query secondaria correlata.

Il risultato di questa query sarà di eliminare tutte le righe da Photo dove hs_id non è nullo fintanto che HotelSupplier ha almeno una riga dove id = 142 (e quindi la sottoquery restituisce almeno una riga)

Potrebbe essere un po ‘più chiaro se si considera quale sia l’effetto di questo

 delete from Photo where Photo.hs_id in (select Photo.hs_id) 

Questo è ovviamente equivalente a

 delete from Photo where Photo.hs_id = Photo.hs_id 

A proposito questo è di gran lunga il “bug” più comune che personalmente ho visto erroneamente riportato su Microsoft Connect. Erland Sommarskog lo include nella sua lista dei desideri per SET STRICT_CHECKS ON

È un argomento forte per mantenere coerenti i nomi delle colonne tra le tabelle. Come dice @Martin, la syntax SQL consente di risolvere i nomi delle colonne dalla query esterna, quando non c’è corrispondenza nella query interna. Questo è un vantaggio quando si scrivono sottoquery correlate, ma a volte si può inciampare (come qui)