आपका प्रश्न पहले से ही उत्तर दिया गया है, लेकिन किसी को एक अलग मामला हो सकता है, जहां वे नवीनतम EFFDT प्राप्त करने की आवश्यकता एक निश्चित तिथि के बजाय, एक कॉलम के आधार पर। उन मामलों के लिए, मैं केवल एक अपूणर् विकल्प है, और एक बदसूरत समाधान ... पाया
अपूर्ण विकल्प:
SELECT ...
FROM MYTABLE N, CUST_OPT C
WHERE etc...
AND C.SETID (+) = N.SETID
AND C.CUST_ID (+) = N.CUST_ID
AND NVL(C.EFFDT,TO_DATE('01011900','DDMMYYYY')) = NVL((SELECT MAX(EFFDT)
FROM CUST_OPT SC
WHERE SC.SETID = C.SETID
AND SC.CUST_ID = C.CUST_ID
AND SC.EFFDT <= N.ISSUE_DT)
,TO_DATE('01011900','DDMMYYYY'))
यह एक अपूर्ण विकल्प है क्योंकि अगर CUST_OPT तालिका भविष्य दिनांकों है, लेकिन कोई वर्तमान (< = N.ISSUE_DT) तिथियां, बाहरी जुड़ाव काम नहीं करेगा और कोई पंक्तियां वापस नहीं की जाएंगी। आम तौर पर पीपुल्स सॉफ्ट शब्द (हाँ मैंने आपके सेटिड + ईएफएफडीटी को देखा है! ;- डी) यह अक्सर ऐसा नहीं होता क्योंकि लोग "हमेशा के लिए" से पहले मूल्य को प्रभावी बनाने के लिए 01/01/1900 ईएफएफडीटी बनाते हैं, लेकिन तब से यह हमेशा मामला नहीं है;
SELECT n.field1, n.field2,
CASE WHEN NVL(c.EFFDT,n.ISSUE_DT-1)<=n.ISSUE_DT THEN c.field1 ELSE NULL END,
CASE WHEN NVL(c.EFFDT,n.ISSUE_DT-1)<=n.ISSUE_DT THEN c.field2 ELSE NULL END
FROM MYTABLE N, CUST_OPT C
WHERE etc...
AND C.SETID (+) = N.SETID
AND C.CUST_ID (+) = N.CUST_ID
AND NVL(C.EFFDT,TO_DATE('01011900','DDMMYYYY')) = NVL((SELECT MAX(EFFDT)
FROM CUST_OPT SC
WHERE SC.SETID = C.SETID
AND SC.CUST_ID = C.CUST_ID
AND SC.EFFDT <= N.ISSUE_DT)
,NVL((SELECT MIN(EFFDT)
FROM CUST_OPT SC
WHERE SC.SETID = C.SETID
AND SC.CUST_ID = C.CUST_ID
AND SC.EFFDT >= N.ISSUE_DT)
,TO_DATE('01011900','DDMMYYYY')
)
)
यह: जो इस है
मैं भी एक बदसूरत विकल्प पाया (लेकिन मैं वास्तव में यह सलाह देते हैं, और यह समस्या का हल है, तो यह एक समाधान कॉल),: हम भी एक बदसूरत समाधान है विकल्प भविष्य की पंक्तियों को वापस कर देगा जिन्हें अनदेखा किया जाना चाहिए! इसलिए हम SELECT स्टेटमेंट पर स्थितियां जोड़ते हैं जो वापस किए गए मानों को इंगित करेंगे, अगर वे पुनर्प्राप्त करने के लिए नहीं थे। जैसा मैंने कहा था ... यह एक यूजीली समाधान है, लेकिन यह एक समाधान है।
मेरे बदसूरत समाधान के लिए, यदि पंक्तियों को बाद में एक एप्लीकेशन इंजन या पीएल/एसक्यूएल या जो कुछ भी संसाधित किया जाएगा; आप प्रत्येक कॉलम के लिए केस स्टेटमेंट रखने के बजाय, केवल एक नया कॉलम जोड़ सकते हैं जो आपको बताएगा कि आपने "अनुचित" डेटा प्राप्त किया है और इस कॉलम के आधार पर बाद में अपने कोड में फ़ील्ड को अनदेखा कर दिया है, जैसे:
CASE WHEN NVL(c.EFFDT,n.ISSUE_DT-1)<=n.ISSUE_DT THEN 'N' ELSE 'Y' END AS IGNORE_CUST_OP_COLS
कैंपस समाधान? Yukk! –