Столбец не существует в предложении IN, но SQL выполняется - PullRequest
6 голосов
/ 22 февраля 2011

У меня есть запрос, который использует предложение IN. Вот упрощенная версия:

SELECT *
  FROM table A
  JOIN table B
    ON A.ID = B.ID
 WHERE B.AnotherColumn IN (SELECT Column FROM tableC WHERE ID = 1)

tableC не имеет столбца Column, но запрос выполняется без ошибок. Кто-нибудь может объяснить, почему?

Ответы [ 2 ]

14 голосов
/ 22 февраля 2011

Это будет работать, если таблица в запросе external имеет столбец с таким именем. Это связано с тем, что имена столбцов из внешнего запроса доступны для подзапроса, и вы можете намеренно выбрать столбец внешнего запроса в списке 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)
3 голосов
/ 22 февраля 2011

Если вы хотите избежать этой ситуации в будущем (как объяснил Мэтт Гибсон), стоит привыкнуть всегда использовать псевдонимы для указания столбцов. E.g.:

SELECT *
  FROM table A
  JOIN table B
    ON A.ID = B.ID
 WHERE B.AnotherColumn IN (SELECT C.Column FROM tableC C WHERE C.ID = 1)

Это могло бы дать вам приятное сообщение об ошибке (обратите внимание, я также указал псевдоним в предложении where - если бы в tableC не было столбца ID, у вас также были бы дополнительные проблемы)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...