这是有效的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子句项都在一次评价。

和I'd've在2005年SQL编写它:

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+那个丑陋的。这就是为什么微软推出的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标准的一部分。

我还想补充一点,在你原来的例子中,XYZ列都没有,在技术上,派生列的,你给他们打电话。至少就微软和ANSI而言,他们只是别名的,直到它实际上变成一列(即通过一个子查询或CTE)的别名不能参考另一个别名。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top