Это не должно быть так ужасно в SQL Server 2005+. Вот почему Microsoft представила CTE:
WITH T1 AS (SELECT 1 AS X),
T2 AS (SELECT X, 2 * X AS Y FROM T1)
SELECT X, Y, 3 * Y AS Z FROM T2
Или вы можете использовать CROSS APPLY
, как показывает Роб - это может работать, а может и не работать, в зависимости от специфики запроса.
Я признаю, что он не такой чистый, как у Teradata, но он не так плох, как версия подзапроса, и оригинальный пример Teradata в вашем вопросе определенно не является частью стандарта SQL-92.
Я бы также добавил, что в вашем исходном примере столбцы X
, Y
и Z
не являются технически производными столбцами , как вы их называете. По крайней мере, в том, что касается Microsoft и ANSI, они являются просто псевдонимами , и псевдоним не может ссылаться на другой псевдоним, пока он фактически не станет столбцом (т.е. через подзапрос или CTE).