सम्मिलन के क्रम के लिए TEMP_TABLE में अनुक्रमिक प्राथमिक कुंजी या किसी अन्य संकेतक का अभाव है। इसलिए तालिका के कॉलम का उपयोग करके लोड के लिए नवीनतम आईडी प्राप्त करना संभव नहीं है।
हालांकि, एक विकल्प है:ORA_ROWSCN() . यह एक छद्म स्तंभ है जो लेनदेन . के लिए सिस्टम परिवर्तन संख्या की पहचान करता है जिसने टेबल बदल दी। इसलिए हम ORA_ROWSCN पर तालिका को सॉर्ट करके सम्मिलन के क्रम को फिर से बना सकते हैं।
कुछ चेतावनी हैं:
- डिफ़ॉल्ट रूप से एससीएन ब्लॉक स्तर पर लागू होता है। नतीजतन एक ब्लॉक में सभी पंक्तियों में एक ही एससीएन होता है। यह विस्तृत तालिकाओं के लिए काफी अच्छा सन्निकटन है लेकिन TEMP_TABLE जैसे दो-स्तंभ वाले खिलौने के लिए निराशाजनक है। हम पंक्ति स्तर पर SCN को ट्रैक कर सकते हैं लेकिन केवल तभी जब तालिका ROWDEPENDENCIES के साथ बनाई गई हो। डिफ़ॉल्ट NOROWDEPENDENCIES है। दुर्भाग्य से, हम यहाँ ALTER TABLE का उपयोग नहीं कर सकते। आपको तालिका को छोड़ने और फिर से बनाने की आवश्यकता होगी (*) ROWDEPENDENCIES को सक्षम करने के लिए।
- एससीएन लेनदेन पर लागू होता है। इसका मतलब है कि समाधान केवल तभी काम करेगा जब TEMP_TABLE में प्रत्येक पंक्ति को एक अलग लेनदेन में सम्मिलित किया गया हो।
- जाहिर है, यह तभी संभव है जब TEMP_TABLE एक वास्तविक तालिका हो न कि दृश्य या कोई अन्य निर्माण।
यह देखते हुए कि ये सभी मानदंड संतुष्ट हैं, यहां एक प्रश्न है जो आपको वांछित परिणाम देगा:
select load, id
from ( select load
, id
, row_number() over (partition by load order by ora_rowscn desc) as rn
from temp_table
)
where rn = 1
db पर एक डेमो<>fiddle है . साथ ही, NOROWDEPENDENCIES के साथ परिभाषित TEMP_TABLE को छोड़कर वही डेमो, जो गलत परिणाम देता है ।
(*) यदि आप डेटा को TEMP_TABLE में रखना चाहते हैं तो ये चरण हैं:
rename TEMP_TABLE to whatever;
create table TEMP_TABLE as select * from whatever rowdependencies;
drop table whatever;
हालांकि, मौजूदा पंक्तियों के लिए एससीएन समान होगा। यदि यह मायने रखता है तो आपको प्रत्येक पंक्ति को एक बार में सम्मिलित करना होगा, जिस क्रम में आप संरक्षित करना चाहते हैं, और प्रत्येक प्रविष्टि के बाद प्रतिबद्ध होना चाहिए।