ऐसा लगता है कि आप वास्तव में जो चाहते हैं वह एक 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) को मौजूद हो सकता है।
साझा करें और आनंद लें।