Этот вопрос был задан несколько другие времена, но я до сих пор не удалось разобраться в правильный ответ или правильный способ сделать это:Как гнездо КТР правильно
...
;WITH CTE AS
(
SELECT * FROM ...
)
SELECT *, [dbo].[udf_BetaInv](A, B, C, D) AS 'Loss'
FROM CTE
WHERE (Loss >= @MinRetention)
Этот не работает, и я не могу создать хранимую процедуру, я не могу использовать Loss в WHERE, потому что не существует в этой области.
Я хотел бы использовать другой КТР, чтобы обернуть это один, так что я могу поставить, где на внешней один, но не кажется, не работает, попытался это:
;WITH CTE AS
(
SELECT * FROM ...
)
SELECT *, [dbo].[udf_BetaInv(A, B, C, D) AS 'Loss'
FROM CTE,
RESULTS AS
(SELECT * FROM CTE)
SELECT *
FROM RESULTS
WHERE (Loss >= @MinRetention)
Но он не компилируется в SQL Server, я получаю сообщение об ошибке, что '(' неправильно размещает много строк выше, но не имеет никакого отношения, если я удаляю второй CTE, он отлично работает.
Я только хочу избежать дублирования кода, не хочу называть мой [ udf_BetaInv] дважды в выборе, а также в месте.
Вы имеете в виду '[Loss]' (название столбца) не '' Loss'' (строка)? Не уверен, что это приведет к ошибке, хотя – Rup