У вас уже есть множество ответов, некоторые из которых более полезны, чем другие. Но чтобы ответить на ваш вопрос напрямую:
Нет, SQL Server не позволит вам ссылаться на псевдоним столбца (определенный в списке выбора) в предикате (предложение WHERE). Я думаю, что этого достаточно, чтобы ответить на вопрос, который вы задали.
Дополнительные детали:
(это обсуждение выходит за рамки исходного вопроса, который вы задали.)
Как вы заметили, есть несколько доступных обходных путей.
Наиболее проблематичным с отправленным вами запросом (как уже отмечали другие) является то, что мы не гарантируем, что подзапрос в списке SELECT вернет только одну строку. Если он возвращает более одной строки, SQL Server выдаст исключение «слишком много строк»:
Subquery returned more than 1 value.
This is not permitted when the subquery
follows =, !=, , >= or when the
subquery is used as an expression.
Для следующего обсуждения я собираюсь предположить, что проблема уже достаточно решена.
Иногда самый простой способ сделать псевдоним доступным в предикате - это использовать встроенное представление.
SELECT v.*
FROM ( SELECT *
, (SELECT Table1.Column
FROM Table1
JOIN Table2 ON Table1.Table2Id = Table2.Id
WHERE Table1.Column = 1
) as tmp
FROM Table2
) v
WHERE v.tmp = 1
Обратите внимание, что SQL Server не будет вставлять предикат для внешнего запроса (WHERE v.tmp = 1
) в подзапрос во встроенном представлении. Так что вам нужно добавить это в себя, включив предикат WHERE Table1.Column = 1
в подзапрос, особенно если вы зависите от этого, чтобы подзапрос возвращал только одно значение.
Это только один подход к решению проблемы, есть и другие. Я подозреваю, что план запроса для этого запроса SQL Server не будет оптимальным, для производительности вы, вероятно, захотите использовать предикат JOIN или EXISTS.
ПРИМЕЧАНИЕ: я не эксперт по использованию MySQL. Я не очень знаком с поддержкой MySQL для подзапросов. Я знаю (из мучительного опыта), что подзапросы не поддерживались в MySQL 3.23, что делало перенос приложений с Oracle 8 на MySQL 3.23 особенно болезненным.
Да и между прочим ... не представляет интереса для кого-либо, в частности, движок СУБД Teradata DOES имеет расширение, которое допускает использование ключевого слова NAMED вместо ключевого слова AS и выражения NAMED * 1031 На * CAN можно ссылаться в другом месте в QUERY, включая предложение WHERE, предложение GROUP BY и предложение ORDER BY. Shuh-weeeet