2012-12-12 8 views
6

मैं नीचे क्वेरी से ORA-00947: not enough values हो रही है:ओरेकल - एसक्यूएल - उप साथ में डालने का चयन

insert into tableb 
(colA, colb, colc, cold) 
select 
(select max(rec_no)+1 from tableb) 
F2, 
F3, 
F4 
from tablea; 

किसी ने मुझे सही तरीका को इंगित कर सकते हैं/चयन बयान में एक inser के लिए एक उप क्वेरी शामिल करने के लिए?

धन्यवाद

+5

मुझे आशा है कि आप कर रहे हैं

आपके मामले में एक दृश्य से मूल्यों को बनाने के लिए, आपको स्पष्ट रूप से पहले एक दृश्य बनाने की जरूरत उस 'अधिकतम() 'दृष्टिकोण का उपयोग करके एक अद्वितीय आईडी बनाने की कोशिश नहीं कर रहा है। क्योंकि यह बस काम नहीं करेगा। एक अनुक्रम –

+0

@a_horse_with_no_name वास्तव में यह वही उपयोग करें जो मैं कोशिश कर रहा था। क्या आप इस बारे में चर्चा के लिए एक लिंक प्रदान कर सकते हैं कि मैं इसे अनुक्रम के साथ कैसे प्राप्त करूं? धन्यवाद –

+1

मेरा जवाब देखें। अनुक्रम अभी भी समस्या को हल नहीं करेगा यदि टेबलला खाली है (डेविड एल्ड्रिज का उल्लेख किया गया है) –

उत्तर

13

आप बस एक अल्पविराम खो रहे हैं। जैसा कि है, ओरेकल सोचता है F2 आपके उप-चयन का नाम है।

insert into tableb 
(colA, colb, colc, cold) 
select 
(select max(rec_no)+1 from tableb) , -- comma here 
F2, 
F3, 
F4 
from tablea; 
+1

धन्यवाद! मैं पागल हो रहा था! –

+1

काम नहीं करेगा यदि तालिका में कोई पंक्ति नहीं है, या कई सत्र एक ही समय में उस कोड को चला रहे हैं। दुर्भाग्यवश दृष्टिकोण मूल रूप से त्रुटिपूर्ण है। –

+0

@ डेविड एल्ड्रिज टेबल खाली नहीं हैं, मैं केवल इस कोड को चलाने वाला अकेला हूं। क्या कोई बेहतर तरीका है? –

6

अद्वितीय आईडी उत्पन्न करने का एकमात्र विश्वसनीय, तेज़ और स्केलेबल तरीका अनुक्रमों का उपयोग कर रहा है।

कारण max() "समाधान" काम नहीं करेगा, एक लेनदेन किसी अन्य लेनदेन से असामान्य परिवर्तन नहीं देखेगा। तो दो समवर्ती लेन-देन max() के लिए समान मान का उपयोग करके हवाएं कर सकते हैं जो बदले में डुप्लिकेट आईडी मान उत्पन्न करेगा।

create sequence seq_b; 

फिर अपने चयन बयान में उस क्रम का उपयोग करें::

insert into tableb 
    (colA, colb, colc, cold) 
select seq_b.nextval, 
     F2, 
     F3, 
     F4 
from tablea; 
+0

स्पष्टीकरण और सहायता के लिए धन्यवाद। –

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