إعادة استخدام الأعمدة المشتقة في وقت مبكر (أو إعادة ترتيبها) في استعلام-هل هذا صحيح ANSI SQL؟

StackOverflow https://stackoverflow.com/questions/2458700

سؤال

هل هذا صالح 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 للفقرة مرة واحدة.

وقد كتبته في 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
;

نصائح أخرى

لا يلزم أن يكون قبيحًا في SQL Server 2005+. لهذا السبب قدمت Microsoft CTEs:

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

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top