6

これは有効なANSISQLですか?:

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

ただし、SQLServer2005には次のようなものが必要です。

SELECT  X
       ,Y
       ,3 * Y AS Z
FROM    (
         SELECT X
               ,2 * X AS Y
         FROM   (
                 SELECT 1 AS X
                ) AS X
        ) AS Y
4

2 に答える 2

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
;
于 2010-03-17T02:20:22.747 に答える
2

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、Rob が示すように使用することもできます。これは、クエリの詳細に応じて機能する場合と機能しない場合があります。

Teradataほどきれいではないことは認めますが、サブクエリバージョンほど悪くはありません.質問の元のTeradataの例は、SQL-92標準の一部ではありません.

Xまた、元の例では、 、YおよびZ列は、技術的には、派生列ではないことも付け加えておきます。少なくとも Microsoft と ANSI に関する限り、それらは単なるエイリアスであり、エイリアスは実際に列になるまで (つまり、サブクエリまたは CTE を介して) 別のエイリアスを参照することはできません。

于 2010-03-17T02:33:19.687 に答える