Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Колоната не съществува в клаузата IN, но SQL се изпълнява

Това ще работи, ако таблица във външния заявката има колона с това име. Това е така, защото имената на колони от външната заявка са достъпни за подзаявката и вие може умишлено да искате да изберете външна колона за заявка в списъка SELECT на вашата подзаявка.

Например:

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)

Както отбелязва Деймиън, най-сигурният начин да се предпазите от този не твърде очевиден „случка“ е да придобиете навика да квалифицирате имената на колоните си в подзаявката:

-- 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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Определете дали SP параметърът има стойност по подразбиране в T-SQL

  2. Вмъкване на резултати от съхранена процедура във временна таблица

  3. Ескейпиращ символ в SQL Server

  4. Максимален размер за заявка на SQL сървър? IN клауза? Има ли по-добър подход

  5. SQL Server:параметри ORDER BY в оператор IN