Oracle
 sql >> डेटाबेस >  >> RDS >> Oracle

Oracle बाहरी जुड़ाव अपेक्षा के अनुरूप काम नहीं कर रहा है

ऐसा लगता है कि आप वास्तव में जो चाहते हैं वह एक INNER जॉइन है। (+) को छोड़ दें और देखें कि क्या आप जो खोज रहे हैं वह आपको वापस मिल गया है। इसके अलावा, @GordonLinoff एक उत्कृष्ट सुझाव देता है - एएनएसआई जॉइन सिंटैक्स का उपयोग करने में सहज महसूस करें, जो पुरानी शैली की तुलना में अधिक अभिव्यक्तिपूर्ण और अधिक समझने योग्य दोनों है "सभी शर्तों को WHERE क्लॉज में रखें और फिर इसे पहेली करने का प्रयास करें" शैली ।

यहां बताया गया है कि मैं एएनएसआई-मानक जॉइन सिंटैक्स का उपयोग करके इस क्वेरी को फिर से कैसे लिखूंगा:

SELECT *
  FROM PER_ALL_ASSIGNMENTS_F paaf
  INNER JOIN PAY_ALL_PAYROLLS_F payr
    ON payr.PAYROLL_ID = paaf.PAYROLL_ID
  WHERE SYSDATE BETWEEN paaf.EFFECTIVE_START_DATE
                    AND paaf.EFFECTIVE_END_DATE AND
        paaf.ASSIGNMENT_TYPE IN ('E', 'C') AND
        paaf.PRIMARY_FLAG = 'Y' AND
        payr.ATTRIBUTE1 = 'TINT' AND
        paaf.EFFECTIVE_START_DATE BETWEEN NVL(payr.EFFECTIVE_START_DATE, TO_DATE('01/01/1000', 'DD/MM/YYYY')) 
                                      AND NVL(payr.EFFECTIVE_END_DATE, TO_DATE('31/12/4712', 'DD/MM/YYYY'))

एक और मामूली बात। मैंने देखा है कि आप दिनांक मानों के साथ BETWEEN का उपयोग कर रहे हैं जो संभावित रूप से समस्याग्रस्त हो सकता है। मान लीजिए, उदाहरण के लिए, आपको PER_ALL_ASSIGNMENTS_F में किसी पंक्ति पर 01-JUN-2013 का EFFECTIVE_START_DATE और 30-JUN-2013 का EFFECTIVE_END_DATE मिला है, और आगे यह भी कहते हैं कि वर्तमान दिनांक और समय 30-JUN-2013 है सुबह 07:02:04 बजे। इन डेटा मानों को देखते हुए, PER_ALL_ASSIGNMENTS_F की यह पंक्ति नहीं होगी चुना जा सकता है, हालाँकि आप इसकी उम्मीद कर सकते हैं। मुद्दा यह है कि जब DATE मान पर भरे गए एकमात्र फ़ील्ड दिन, महीने और वर्ष होते हैं, तो घंटा, मिनट और सेकंड डिफ़ॉल्ट रूप से शून्य हो जाते हैं - इस प्रकार अंतिम तिथि वास्तव में होती है 30-जून-2013 को 00:00:00 बजे, जो 30-जून-2013 की वर्तमान तिथि/समय 07:02:04 पूर्वाह्न से पहले है, और फलस्वरूप दिनांक तुलना के कारण पंक्ति को अनदेखा कर दिया जाता है। मुझे नहीं पता कि आपके डेटाबेस में EFFECTIVE_END_DATE फ़ील्ड कैसे भरे गए हैं - उम्मीद है कि वे पूरी तरह से भरे हुए हैं, उदा। 30-जून-2013 23:59:59 - लेकिन यदि नहीं तो आपको अपनी तिथि की तुलना कुछ इस तरह करने की आवश्यकता हो सकती है

TRUNC(SYSDATE) BETWEEN paaf.EFFECTIVE_START_DATE
                   AND paaf.EFFECTIVE_END_DATE

या

SYSDATE BETWEEN paaf.EFFECTIVE_START_DATE
            AND paaf.EFFECTIVE_END_DATE + INTERVAL '1' DAY - INTERVAL '1' SECOND

(पहला विकल्प शायद एक बेहतर विकल्प है, क्योंकि बाद वाला फॉर्म किसी भी गैर-कार्य-आधारित अनुक्रमणिका के उपयोग को रोक देगा जो (EFFECTIVE_START_DATE, EFFECTIVE_END_DATE) को मौजूद हो सकता है।

साझा करें और आनंद लें।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Oracle SQL नेस्टेड संबंध एक स्तर में

  2. एक ksh चर में चयन परिणाम डालें

  3. ओरेकल में संग्रहित प्रक्रिया से परिणामसेट कैसे लौटाएं?

  4. 19.3 PDB बंद ORA-65107 ORA-16078

  5. ओरेकल वॉलेट का उपयोग कैसे करें