Использование вложенного запроса дважды в одном запросе - для FROM и WHERE

Я пытаюсь понять, почему следующий код Microsoft SQL не работает. Я упростил запрос, так как он довольно сложный. В основном часть, которая не работает, — это второй вложенный подзапрос (строка FROM a) — я получаю сообщение об ошибке: Недопустимое имя объекта «a».

Я был бы признателен за любые советы о том, почему это не работает и как я могу заставить его работать. Некоторые справочные источники о том, почему это не работает, также были бы полезны, поскольку я изо всех сил пытаюсь найти какую-либо информацию об ограничениях вложенных запросов, помимо некоторых основ.

SELECT * 
FROM (
SELECT ... FROM ...
) a

WHERE x IN( 
SELECT x 
FROM a  
WHERE v1=v2)

person joanxm    schedule 18.11.2020    source источник
comment
Возможно, вы хотите КТ?   -  person jarlh    schedule 18.11.2020
comment
Похоже, хотя ошибка будет вызвана второй и последней строкой вашего псевдозапроса, поскольку рассматриваемый a является псевдонимом для первого подзапроса. Можете ли вы предоставить примерную дату и код, чтобы работа над отладкой была более эффективной?   -  person etch_45    schedule 18.11.2020
comment
спасибо @jarlh, я только что посмотрел, что такое ctes, и мне удалось переписать свой код с помощью cte, чтобы он работал. К сожалению, я не могу указать дату выборки, поскольку данные, над которыми я работаю, являются конфиденциальными конфиденциальными данными. Но проблема решена, спасибо!   -  person joanxm    schedule 18.11.2020
comment
У вас есть дополнительная информация здесь: stackoverflow.com/questions/35248217 /   -  person Emin Mesic    schedule 18.11.2020


Ответы (1)


Мне удалось решить свою проблему благодаря предложению в комментариях использовать CTE. Поэтому я преобразовал его в:

WITH CTE_1
AS
 (
SELECT ... FROM ...
) 
SELECT * FROM CTE_1
WHERE x IN( 
SELECT x 
FROM CTE_1  
WHERE v1=v2)
person joanxm    schedule 18.11.2020