Этот допустимый ANSI SQL?:
SELECT 1 AS X
,2 * X AS Y
,3 * Y AS Z
Поскольку Teradata (12) может сделать это, а также это (да, сумасшедший не это):
SELECT 3 * Y AS Z
,2 * X AS Y
,1 AS X
Но SQL Server 2005 требует чего-то вроде этого:
SELECT X
,Y
,3 * Y AS Z
FROM (
SELECT X
,2 * X AS Y
FROM (
SELECT 1 AS X
) AS X
) AS Y
Нет, это недопустимый ANSI. ANSI предполагает, что все элементы предложения SELECT оцениваются одновременно.
И я бы написал это в SQL 2005 как:
SELECT *
FROM (SELECT 1 AS X) X
CROSS APPLY (SELECT 2 * X AS Y) Y
CROSS APPLY (SELECT 3 * Y AS Z) Z
;
В 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).