سؤال

وعندي استفسار والتي من المفترض أن تظهر لي أي الصفوف في الجدول ألف التي لم يتم تحديثها مؤخرا بما فيه الكفاية. (يجب أن يتم تحديثه كل صف في 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 علم .

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