sql >> Databasteknik >  >> RDS >> Sqlserver

Kolumn finns inte i IN-satsen, men SQL körs

Detta kommer att fungera om en tabell i yttre frågan har en kolumn med det namnet. Detta beror på att kolumnnamn från den yttre frågan är tillgängliga för underfrågan, och du kan medvetet mena att välja en yttre frågekolumn i din underfråga VÄLJ-lista.

Till exempel:

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)

Som Damien konstaterar är det säkraste sättet att skydda dig från denna inte alltför uppenbara "gotcha" att ta för vana att kvalificera dina kolumnnamn i underfrågan:

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


  1. Infoga stora objektdata i Salesforce.com från SQL Server

  2. PDO hämta en kolumn från tabellen till 1-dimensionell array

  3. välja för uppdatering med JDBC?

  4. lagrade procedurer med sqlAlchemy