2010-05-03 15 views
7

के दौरान वृद्धिशील संख्यात्मक कॉलम मान उत्पन्न करना मुझे नई तालिका में एक संख्यात्मक कॉलम के लिए वृद्धिशील मान उत्पन्न करते समय, ओरेकल में एक तालिका से दूसरे डेटा को कॉपी करने की आवश्यकता है। यह पंक्तियों की एक छोटी संख्या (100) के साथ एकमात्र व्यायाम है।INSERT SELECT कथन

मेरे पास इस समस्या का पर्याप्त समाधान है लेकिन मुझे यह जानकर उत्सुकता है कि क्या कोई और शानदार तरीका है।

मैं एक अस्थायी अनुक्रम के साथ यह कर रहा हूँ तो जैसे:

CREATE SEQUENCE temp_seq 
    START WITH 1; 

INSERT INTO new_table (new_col, copied_col1, copied_col2) 
    SELECT temp_seq.NEXTVAL, o.* 
     FROM (SELECT old_col1, old_col2 
       FROM old_table, 
      ORDER BY old_col1) o; 

DROP SEQUENCE temp_seq; 

वहाँ से कोई लेना देना रास्ता अनुक्रम या किसी अन्य अस्थायी वस्तु बनाने के बिना है? विशेष रूप से, क्या यह स्वयं निहित इंसर्ट चयन कथन के साथ किया जा सकता है?

कृपया एक ट्रिगर को एक गैर-विकल्प होने पर विचार करें।

अधिक जानकारी: मैं आदेश को नियंत्रित करने के कि नई पंक्तियाँ डाला जाता है चाहते हैं, और यह एक ही क्रम में वे पुराने तालिका (ध्यान दें में बनाये गये थे मैं ऊपर ORDER BY खंड जोड़ दिया है नहीं होगा)। लेकिन मैं अब भी अपना नया अनुक्रमिक कॉलम 1 से शुरू करना चाहता हूं।

इसी तरह के प्रश्न हैं, लेकिन मुझे विश्वास है कि मेरे प्रश्न के विनिर्देश SO के लिए मूल हैं।

उत्तर

10

आप ROWNUM का उपयोग कर सकते हैं। इस छद्म स्तंभ संख्या अपने परिणाम में पंक्तियों:

Insert Into new_table (new_col, copied_col1, copied_col2) 
    Select Rownum, old_col1, old_col2 
    From (
     Select old_col1, old_col2 
     From old_table 
     Order By old_col1 
    ); 
+0

पीटर, अतिरिक्त मानदंड देखें जो मैंने प्रश्न जोड़ा है। यह विधि पुरानी तालिका में बनाए गए क्रम में पंक्तियों को सम्मिलित करने लगती है, लेकिन मैं अपना ऑर्डर लागू करना चाहता हूं। यदि इस आवश्यकता के लिए नहीं, तो आपकी विधि सही होगी। कोई विचार? –

+0

@ चार्ल्स: मेरी क्वेरी वास्तव में पंक्तियों को सॉर्ट नहीं करती है, इसलिए यह संभव है कि वे बनाए गए क्रम में डाले गए हों (लेकिन गारंटी नहीं है)। क्या आपने अपनी क्वेरी में 'ORDER BY' लागू करने का प्रयास किया है? मैं यह काम करने की उम्मीद करता हूँ। –

+0

फिर चयन कथन में ORDER जोड़ें। आपको वह चाहिए जो आप चाहते हैं। ROWNUM बस पुनर्प्राप्त आदेश में रिकॉर्ड्स के लिए अनुक्रम संख्या उत्पन्न करता है। – DCookie

-1

तुम क्यों परिभाषित नहीं करते:

Insert Into new_table (new_col, copied_col1, copied_col2) 
    Select Rownum, old_col1, old_col2 
    From old_table; 

आप अपने रिकॉर्ड के अनुसार क्रमबद्ध किया जाना चाहते हैं, तो आप एक उप क्वेरी का उपयोग करने की आवश्यकता है primary_key या अद्वितीय के रूप में कॉलम new_col और इसे autoincrement के रूप में चिह्नित करें? इस तरह प्रत्येक डालने से अगले उच्च "गिनती" मिल जाएगी।

मैं ऑरैकल से बहुत परिचित नहीं हूं, लेकिन मैं शर्त लगाता हूं कि ऑटोइनक्रिकमेंट फ़ंक्शन में बनाया गया है।

+1

@ फिलिप आंद्रे: कोई * ऑटोइनक्रिकमेंट फ़ंक्शन नहीं है *, ओरेकल इसके बजाय अनुक्रमों का उपयोग करता है। –

+0

@ पीटर लैंग: वास्तव में? यह मुझे आश्चर्यचकित करता है, लेकिन इसकी बहुत पहले मैंने ऑरैकल के साथ खेला है। जानकर अच्छा लगा। धन्यवाद! –

+0

यही वह है जो मैंने SQL सर्वर में किया होगा। :) –

संबंधित मुद्दे