尽早(或重新排序)重用查询中的派生列-这是有效的ANSI SQL吗? [英] Early (or re-ordered) re-use of derived columns in a query - is this valid ANSI SQL?

查看:95
本文介绍了尽早(或重新排序)重用查询中的派生列-这是有效的ANSI SQL吗?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

这是有效的ANSI SQL吗?:

Is this valid ANSI SQL?:

SELECT 1 AS X
       ,2 * X AS Y
       ,3 * Y AS Z

因为Teradata(12)既可以做到这一点,又可以做到这一点(是的,不是吗?):

Because Teradata (12) can do this, as well as this (yes, crazy isn't it):

SELECT 3 * Y AS Z
       ,2 * X AS Y
       ,1 AS X

但是SQL Server 2005需要这样的内容:

But SQL Server 2005 requires something like this:

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子句项都被立即求值.

No, it's not valid ANSI. ANSI assumes that all SELECT clause items are evaluated at once.

我在SQL 2005中将其编写为:

And I'd've written it in SQL 2005 as:

SELECT *
FROM        (SELECT 1 AS X) X
CROSS APPLY (SELECT 2 * X AS Y) Y
CROSS APPLY (SELECT 3 * Y AS Z) Z
;

这篇关于尽早(或重新排序)重用查询中的派生列-这是有效的ANSI SQL吗?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆