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

Spalte existiert nicht in der IN-Klausel, aber SQL wird ausgeführt

Dies funktioniert, wenn eine Tabelle im äußeren Abfrage hat eine Spalte mit diesem Namen. Dies liegt daran, dass Spaltennamen aus der äußeren Abfrage für die Unterabfrage verfügbar sind und Sie möglicherweise absichtlich eine äußere Abfragespalte in Ihrer Unterabfrage-SELECT-Liste auswählen möchten.

Zum Beispiel:

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)

Wie Damien feststellt, besteht der sicherste Weg, sich vor diesem nicht allzu offensichtlichen „Fallloch“ zu schützen, darin, es sich zur Gewohnheit zu machen, die Spaltennamen in der Unterabfrage zu qualifizieren:

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