Рано (или переупорядоченный) повторным использованием полученных столбцов в запросе - является этот допустимый ANSI SQL?

Этот допустимый 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
6
задан Cade Roux 16 March 2010 в 22:45
поделиться

2 ответа

Нет, это недопустимый 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
;
5
ответ дан 17 December 2019 в 00:07
поделиться

В 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).

2
ответ дан 17 December 2019 в 00:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: