在查询中早期(或重新排序)重用派生列 - 这是有效的ANSI SQL吗?

Cad*_*oux 6 sql sql-server teradata ansi-sql

这是有效的ANSI SQL吗?:

SELECT 1 AS X
       ,2 * X AS Y
       ,3 * Y AS Z
Run Code Online (Sandbox Code Playgroud)

因为Teradata(12)可以做到这一点,以及这个(是的,疯了不是它):

SELECT 3 * Y AS Z
       ,2 * X AS Y
       ,1 AS X
Run Code Online (Sandbox Code Playgroud)

但是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
Run Code Online (Sandbox Code Playgroud)

Rob*_*ley 5

不,它不是有效的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
;
Run Code Online (Sandbox Code Playgroud)