Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

SQL Server 2008 Management Studio überprüft die Syntax meiner Abfrage nicht

Es nimmt den Wert von hs_id an aus der äußeren Abfrage.

Es ist absolut zulässig, eine Abfrage zu haben, die keine Spalten aus der ausgewählten Tabelle in ihrem select projiziert Liste.

Zum Beispiel

select 10 from HotelSupplier where id = 142

würde eine Ergebnismenge mit so vielen Zeilen zurückgeben, wie mit where übereinstimmen -Klausel und den Wert 10 für alle Zeilen.

Unqualifizierte Spaltenreferenzen werden vom nächstgelegenen Bereich nach außen aufgelöst, sodass dies nur als korrelierte Unterabfrage behandelt wird.

Das Ergebnis dieser Abfrage ist das Löschen aller Zeilen aus Photo wobei hs_id ist nicht null, solange HotelSupplier mindestens eine Zeile mit id =142 hat (und daher gibt die Unterabfrage mindestens eine Zeile zurück)

Es könnte etwas klarer werden, wenn Sie bedenken, was dies bewirkt

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

Dies ist natürlich äquivalent zu

delete from Photo where Photo.hs_id = Photo.hs_id

Übrigens ist dies bei weitem der häufigste "Fehler", den ich persönlich gesehen habe, der fälschlicherweise auf Microsoft Connect gemeldet wurde. Erland Sommarskog nimmt es in seine Wunschliste für SET STRICT_CHECKS ON auf