إعادة استخدام الأعمدة المشتقة في وقت مبكر (أو إعادة ترتيبها) في استعلام-هل هذا صحيح ANSI SQL؟
-
20-09-2019 - |
سؤال
هل هذا صالح 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).