2016-04-28 15 views
7

बस Oracle की सम्मिलित वाक्य रचना को देख जब में डालें, मैं तुम्हें एक प्रश्न है, उदा में सम्मिलित कर सकते देखाएक प्रश्न

insert into (select * from dept) (deptno, dname) values (99, 'new department'); 

क्या कोई इस बात पर कुछ प्रकाश डाल सकता है कि इसका क्या अर्थ है? मैं एक क्वेरी में डालने के साथ क्या हासिल कर सकता हूं जिसे मैं सीधे तालिका में डालने के साथ नहीं कर सकता?

अद्यतन: अब तक ऐसा लगता है यह सिर्फ एक विकल्प वाक्य रचना है, इसलिए मैं

insert into (select deptno, dname from dept) values (99, 'new department'); 

बजाय

insert into dept (deptno, dname) values (99, 'new department'); 

यही बात, एक ही कार्य योजना लागू करके लिख सकते हैं। इससे कोई फ़र्क नहीं पड़ता कि क्वेरी रिकॉर्ड लौटाती है या नहीं। यह:

insert into (select deptno, dname from dept where 1 = 0) values (99, 'new department'); 

फिर से उसी निष्पादन योजना की ओर जाता है। तो हम मान सकते हैं कि यह वास्तव में कोई फर्क नहीं पड़ता कि सबक्वायरी तब तक दिखता है जब तक हम केवल एक तालिका से कॉलम का चयन नहीं करते हैं। लेकिन नहीं। यह:

insert into (select deptno, dname from dept cross join some_table) 
values (99, 'new department'); 

ओर जाता है करने के लिए "ORA-01,779: एक स्तंभ जो एक गैर कुंजी से संरक्षित मेज पर नक्शे संशोधित नहीं कर सकते" या ": डेटा हेरफेर आपरेशन इस दृश्य पर कानूनी नहीं ORA-01,732"।

मैं धारणा है कि ओरेकल एक प्रश्न में डालने, क्योंकि वे, और क्या एक सबक्वेरी यहाँ तो एक तदर्थ दृश्य है के मामले में दृश्य में डालने की अनुमति देने के लिए अनुमति देते हैं करने का निर्णय लिया है? तो जब आप एक दृश्य में सम्मिलित कर सकते हैं, निश्चित रूप से वे आपको एक विज्ञापन दृश्य में भी डालने देते हैं, लेकिन उनके सही दिमाग में कोई भी इस वाक्यविन्यास का उपयोग कभी नहीं करेगा :-)

लेकिन शायद मैं गलत हूं? हो सकता है कि यह वाक्यविन्यास ऐसा कुछ प्रदान करता है जिसे मैं अभी तक नहीं जानता हूं? यदि ऐसा है तो मुझे बताएं :-)

उत्तर

0

सबक्वेरी तालिका के कॉलम में जो पंक्तियाँ सम्मिलित करने के लिए कर रहे हैं परिभाषित करता है। oracle's doc (12c) कहते हैं:

Specify the name of the [...] column or columns returned by a subquery, into which rows are to be inserted. If you specify a view or object view, then the database inserts rows into the base table of the view.

उदाहरण

create table test_isq (
    pk integer not null primary key, data_1 varchar2(40), data_2 varchar2(40), data_3 varchar2(40) 
); 

-- ok 
insert into (select pk, data_2, data_3 from test_isq) (pk, data_2) values (1, 'Test'); 
insert into (select pk, data_2, data_3 from test_isq) values (2, 'Another', 'Test'); 

-- fail 
insert into (select data_1 from test_isq) values ('This', 'one', 'fails'); 
insert into (select data_1 from test_isq) (pk, data_1) values (42, 'Nope'); 

drop table test_isq; 
+0

आह, तो क्या आप कह रहे हैं कि यह सिर्फ एक वैकल्पिक वाक्यविन्यास है? मैं 'dept (deptno, dname) मानों (...)' में डाल सकता हूं या 'सम्मिलित करें, deptno, dename से dname) मान (...) '। तो यह वही बात लिखने का एक और तरीका है और किसी के पास कोई दूसरा फायदा नहीं है? –

+0

असल में हाँ - हालांकि मैंने संभावित विधियों का शोध नहीं किया है। दस्तावेज़ों के आधार पर मैं उनसे अपेक्षा नहीं करता, जब तक कि आपके पास केवल 'सम्मिलित' विशेषाधिकार न हों और संबंधित तालिका पर 'चयन' न करें। – collapsar

-1

ऐसा इसलिए है क्योंकि SELECT कथन में INSERT एक तालिका से डेटा का चयन करता है और इसे किसी मौजूदा तालिका में डालता है। लक्ष्य तालिका में मौजूद कोई भी मौजूदा पंक्तियां अप्रभावित हैं।

+1

मुझे लगता है कि आप इसे एक सम्मिलित चयन के साथ भ्रमित कर रहे हैं: 'dept (deptno, dname) में डालें, deptnumber का चयन करें, new_departments से deptname'। –

+0

ओह हाँ ... उपकुंजी का उपयोग करने के कारण (चयन *) में डालने का कारण ऑरैकल तालिका में किसी भी बदलाव की अनुमति नहीं देगा जो पंक्तियों का उत्पादन करेगा जो उप-क्वेरी में शामिल नहीं हैं। –

+0

तो मैं केवल इतना ही कह सकता हूं कि पहले से क्या है? इसका कोई अर्थ नही बन रहा है। और वैसे भी मैंने subquery में '1 = 0'' के साथ प्रयास किया और यह किसी भी तरह से सम्मिलित नहीं करता है। ऐसा लगता है कि सबक्वायरी पंक्तियों को वापस करता है या नहीं। –

-1

मूल रूप से * से हटाएं * क्वेरी से हटाए गए तालिका का डेटा वापस कॉलम नाम नहीं दिया गया है। और कॉलम नाम निर्दिष्ट करने के लिए सम्मिलित करें ताकि यह संभव न हो।

और जब आप (deptno, dname) का चयन deptnumber, new_departments उस समय का चयन क्वेरी वापसी डेटा से deptname विभाग में इसलिए इस क्वेरी डालने लिख सकते हैं और इसलिए यह डाला जाता है यह मूल्य है।

+0

क्षमा करें, मुझे यह जवाब समझ में नहीं आता है। मैं dept (...) मानों (...) 'में डाल सकता हूं' और मैं 'डिप्टी से चुनें *) (...) मान (...) 'डाल सकता हूं। मैं नहीं देखता कि दूसरे कथन में एक क्वेरी का उपयोग करने से मुझे पहली क्वेरी में सीधे टेबल नामकरण पर कोई फायदा होता है। –

5

एक सबक्वेरी में सम्मिलित करना WITH CHECK OPTION का उपयोग कर परिणाम सीमित अनुमति देता है।

उदाहरण के लिए, मान लीजिए कि आप किसी भी विभाग के नाम को "नए विभाग" के लिए को छोड़कर अनुमति देना चाहते हैं। एक अलग मूल्य का उपयोग कर इस उदाहरण ठीक काम करता है:

SQL> insert into 
    2 (select deptno, dname from dept where dname <> 'new department' WITH CHECK OPTION) 
    3 values (98, 'old department'); 

1 row created. 

लेकिन अगर वह बुरा मान डाला जाता है यह एक त्रुटि फेंकता है:

SQL> insert into 
    2 (select deptno, dname from dept where dname <> 'new department' WITH CHECK OPTION) 
    3 values (99, 'new department'); 
(select deptno, dname from dept where dname <> 'new department' WITH CHECK OPTION) 
          * 
ERROR at line 2: 
ORA-01402: view WITH CHECK OPTION where-clause violation 

मैं इस सुविधा जंगली में इस्तेमाल कभी नहीं देखा। दृश्यों में यह विकल्प होता है, इसलिए यह समझ में आता है कि आपको एक सबकुछ के साथ एक ही चीज़ करने में सक्षम होना चाहिए। मुझे यकीन नहीं है कि कोई ऐसा क्यों करना चाहेगा, हालांकि, INSERT को फ़ीड करने वाले SELECT कथन पर सीमा डालना उतना ही आसान है। और यदि INSERT VALUES का उपयोग करता है तो इसे एक SELECT कथन में परिवर्तित करने के लिए तुच्छ है। > Single_table_insert - -> सबक्वेरी -> query_block -> table_reference -> query_table_expression -> subquery_restriction_clause insert:

आप वास्तव में वाक्य रचना चित्र में खुदाई करने के लिए इस सुविधा को देखने के लिए है।

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