استخدام اسم مستعار في جملة WHERE
سؤال
وعندي استفسار والتي من المفترض أن تظهر لي أي الصفوف في الجدول ألف التي لم يتم تحديثها مؤخرا بما فيه الكفاية. (يجب أن يتم تحديثه كل صف في 2 أشهر بعد "month_no"):
SELECT A.identifier
, A.name
, TO_NUMBER(DECODE( A.month_no
, 1, 200803
, 2, 200804
, 3, 200805
, 4, 200806
, 5, 200807
, 6, 200808
, 7, 200809
, 8, 200810
, 9, 200811
, 10, 200812
, 11, 200701
, 12, 200702
, NULL)) as MONTH_NO
, TO_NUMBER(TO_CHAR(B.last_update_date, 'YYYYMM')) as UPD_DATE
FROM table_a A
, table_b B
WHERE A.identifier = B.identifier
AND MONTH_NO > UPD_DATE
والسطر الأخير في جملة WHERE يتسبب خطأ "ORA-00904 غير صالح معرف". وغني عن القول، وأنا لا أريد أن أكرر وظيفة فك كامل في بلدي الشرط WHERE. أي أفكار؟ (كلا إصلاحات والحلول قبلت ...)
المحلول
وهذا غير ممكن مباشرة، لأن زمنيا، حيث يحدث <م> قبل م> SELECT، الذي هو دائما الخطوة الأخيرة في سلسلة التنفيذ.
ويمكنك القيام-حدد الفرعية وتصفية على ما يلي:
SELECT * FROM
(
SELECT A.identifier
, A.name
, TO_NUMBER(DECODE( A.month_no
, 1, 200803
, 2, 200804
, 3, 200805
, 4, 200806
, 5, 200807
, 6, 200808
, 7, 200809
, 8, 200810
, 9, 200811
, 10, 200812
, 11, 200701
, 12, 200702
, NULL)) as MONTH_NO
, TO_NUMBER(TO_CHAR(B.last_update_date, 'YYYYMM')) as UPD_DATE
FROM table_a A
, table_b B
WHERE A.identifier = B.identifier
) AS inner_table
WHERE
MONTH_NO > UPD_DATE
وتحركت قليلا للاهتمام من المعلومات حتى من تعليقات:
<اقتباس فقرة>ويجب أن يكون هناك ضرب الأداء. أوراكل لا تحتاج إلى تجسيد الاستفسارات الداخلية قبل تطبيق الخارجي الشروط - سوف أوراكل النظر تحويل هذا الاستعلام داخليا و دفع المسند الى اسفل الداخلية الاستعلام، وسوف نفعل ذلك إذا كانت التكلفة فعال. - جوستين كهف
اقتباس فقرة>نصائح أخرى
SELECT A.identifier
, A.name
, TO_NUMBER(DECODE( A.month_no
, 1, 200803
, 2, 200804
, 3, 200805
, 4, 200806
, 5, 200807
, 6, 200808
, 7, 200809
, 8, 200810
, 9, 200811
, 10, 200812
, 11, 200701
, 12, 200702
, NULL)) as MONTH_NO
, TO_NUMBER(TO_CHAR(B.last_update_date, 'YYYYMM')) as UPD_DATE
FROM table_a A, table_b B
WHERE .identifier = B.identifier
HAVING MONTH_NO > UPD_DATE
وأو هل يمكن أن يكون الاسم المستعار الخاص بك في بند HAVING
وفقط كنهج بديل ليمكنك القيام به:
WITH inner_table AS
(SELECT A.identifier
, A.name
, TO_NUMBER(DECODE( A.month_no
, 1, 200803
, 2, 200804
, 3, 200805
, 4, 200806
, 5, 200807
, 6, 200808
, 7, 200809
, 8, 200810
, 9, 200811
, 10, 200812
, 11, 200701
, 12, 200702
, NULL)) as MONTH_NO
, TO_NUMBER(TO_CHAR(B.last_update_date, 'YYYYMM')) as UPD_DATE
FROM table_a A
, table_b B
WHERE A.identifier = B.identifier)
SELECT * FROM inner_table
WHERE MONTH_NO > UPD_DATE
كما يمكنك إنشاء طريقة عرض دائم للقائمة الانتظار وحدد من الرأي.
CREATE OR REPLACE VIEW_1 AS (SELECT ...);
SELECT * FROM VIEW_1;
ومن الممكن أن تحدد بشكل فعال متغير التي يمكن استخدامها في كل من SELECT، أين وبنود أخرى.
وA فرعي لا تسمح بالضرورة مناسبا ملزم لأعمدة الجدول المشار إليه، ولكن لا تنطبق الخارجي.
SELECT A.identifier
, A.name
, vars.MONTH_NO
, TO_NUMBER(TO_CHAR(B.last_update_date, 'YYYYMM')) as UPD_DATE
FROM table_a A
, table_b B ON A.identifier = B.identifier
OUTER APPLY (
SELECT
-- variables
MONTH_NO = TO_NUMBER(DECODE( A.month_no
, 1, 200803
, 2, 200804
, 3, 200805
, 4, 200806
, 5, 200807
, 6, 200808
, 7, 200809
, 8, 200810
, 9, 200811
, 10, 200812
, 11, 200701
, 12, 200702
, NULL))
) vars
WHERE vars.MONTH_NO > UPD_DATE
ومجد <لأ href = "https://smehrozalam.wordpress.com/2010/01/25/referring-computedcalculated-columns-in-the-where-and-group-by-clause/" يختلط = " نوفولو noreferrer "> سيد Mehroz علم .