2008-12-10 17 views
59

में एक उपनाम का उपयोग करना मेरे पास एक क्वेरी है जो मुझे तालिका ए में कोई पंक्ति दिखाने के लिए है, जिसे हाल ही में अपडेट नहीं किया गया है। (प्रत्येक पंक्ति "month_no" के बाद 2 महीने के भीतर अद्यतन किया जाना चाहिए।):WHERE क्लॉज

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 

कहां खंड में अंतिम पंक्ति एक "ORA-00904 अमान्य पहचानकर्ता" त्रुटि होती है। कहने की जरूरत नहीं है, मैं अपने WHERDE खंड में पूरे DECODE फ़ंक्शन को दोहराना नहीं चाहता हूं। कोई विचार? (दोनों फिक्स और वर्कअराउंड स्वीकार किए जाते हैं ...)

उत्तर

100

यह संभव नहीं है, क्योंकि कालक्रम के अनुसार, से पहले होता है, जो हमेशा निष्पादन श्रृंखला में अंतिम चरण होता है।

आप इस पर एक उप चयन और फिल्टर कर सकते हैं:

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 

जानकारी के दिलचस्प बिट टिप्पणियों से ऊपर चला गया:

कोई प्रदर्शन हिट होनी चाहिए। ओरेकल बाहरी की स्थिति लागू करने से पहले भीतरी प्रश्नों अमल में लाना की जरूरत नहीं है - ओरेकल विचार करेंगे आंतरिक रूप से इस प्रश्न के बदलने और भीतरी क्वेरी में नीचे विधेय धक्का और अगर यह लागत है प्रभावी ऐसा ही करेगा। - Justin Cave

9

या आप एक HAVING खंड में अपना उपनाम हो सकता है

+4

यह एक दिलचस्प दृष्टिकोण होगा, आप किसी भी कोड दे सकते हैं? – rob5408

+0

वही नियम जहां लागू होता है, इसलिए यह कोई समाधान नहीं है। – Alexey

+0

मैं MySQL (5.5) पर फंस गया हूं, यह नहीं पता कि यह ओरेकल पर लागू होता है या नहीं। लेकिन: 'ग्राहकों का चयन करें, नाम, उपनाम) ग्राहकों के रूप में एक्स एक्स'%% '' काम करता है, जबकि 'चयन कंकट (नाम, उपनाम) AS x ग्राहकों से जहां x%'%% ' 'विफल रहता है (" अज्ञात कॉलम 'x' जहां 'खंड' ') – fr13d

12
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 
1

बस के रूप में आप के लिए एक वैकल्पिक दृष्टिकोण कर सकते हैं:

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; 
संबंधित मुद्दे