दिलचस्प पोस्ट
पायथन में कक्षा फ़ैक्टरी निश्चित कार्ड आईडी के साथ होस्ट-आधारित कार्ड इम्यूलेशन जावा में प्राइमटालिटी के लिए सबसे तेज़ तरीका क्या होगा? 'उपयोगकर्ता परिभाषित प्रकार निर्धारित नहीं' त्रुटि WPF फीका एनीमेशन ग्रहण दुर्घटना जारी रखें JQuery इनपुट का उपयोग करके फ़ाइल इनपुट से पूर्ण पथ एक स्ट्रिंग में एक अक्षर बदलें? आप मूल्य से एक शब्दकोश कैसे सॉर्ट करते हैं? क्यूटी 5 में अतिभारित सिग्नल और स्लॉट को कनेक्ट करना उपयोगकर्ता अंतरिक्ष से कर्नेल स्थान तक कैसे पहुंचें? JQuery में, 2 दशमलव स्थानों पर संख्या को स्वरूपित करने का सबसे अच्छा तरीका क्या है? Symfony2 सिद्धांत स्पष्ट कैश जावा Enums: दो enum प्रकार, एक दूसरे के लिए प्रत्येक संदर्भ युक्त? AngularJS – पूरा करने के लिए कई संसाधन प्रश्नों की प्रतीक्षा करें

में डालें … मान (SELECT … FROM …)

मैं किसी अन्य तालिका से इनपुट का उपयोग करके तालिका में सम्मिलित करने का प्रयास कर रहा हूं। यद्यपि यह कई डाटाबेस इंजनों के लिए पूरी तरह से संभव है, मुझे हमेशा दिन के एसक्यूएल इंजन ( MySQL , Oracle , SQL Server , Informix , और DB2 ) के लिए सही सिंटैक्स को याद रखने में संघर्ष करना पड़ता है।

क्या एक सिल्वर-बुलेट सिंटैक्स एक एसक्यूएल मानक (उदाहरण के लिए, एसक्यूएल -92 ) से आ रहा है जो मुझे अंतर्निहित डेटाबेस के बारे में चिंता किए बिना मूल्यों को सम्मिलित करने की इजाजत देता है?

Solutions Collecting From Web of "में डालें … मान (SELECT … FROM …)"

प्रयत्न:

INSERT INTO table1 ( column1 ) SELECT col1 FROM table2 

यह मानक एएनएसआई एसक्यूएल है और किसी भी डीबीएमएस पर काम करना चाहिए

यह निश्चित रूप से काम करता है:

  • आकाशवाणी
  • एमएस एसक्यूएल सर्वर
  • माई एसक्यूएल
  • postgres
  • SQLite v3
  • Teradata
  • डीबी 2
  • Sybase
  • वर्टिका
  • HSQLDB
  • एच 2
  • ऐडवर्ड्स रेडशिफ्ट
  • सैप हाना

@ Shadow_x99 : यह ठीक काम करना चाहिए, और साथ ही साथ कई कॉलम और अन्य डेटा भी हो सकते हैं:

 INSERT INTO table1 ( column1, column2, someInt, someVarChar ) SELECT table2.column1, table2.column2, 8, 'some string etc.' FROM table2 WHERE table2.ID = 7; 

संपादित करें: मुझे यह बताना चाहिए कि मैंने केवल एक्सेस, SQL 2000/2005 / Express, MySQL, और PostgreSQL के साथ इस सिंटैक्स का उपयोग किया है, इसलिए उनको कवर किया जाना चाहिए। एक टिप्पणीकार ने बताया है कि यह SQLite3 के साथ काम करेगा।

किसी अन्य मूल्य से INSERT बहु मूल्य में केवल एक मान प्राप्त करने के लिए मैंने निम्न SQLite3 में किया था:

 INSERT INTO column_1 ( val_1, val_from_other_table ) VALUES('val_1', (SELECT val_2 FROM table_2 WHERE val_2 = something)) 

दोनों जवाब मैं विशेष रूप से Informix में काम ठीक देखते हैं, और मूल रूप से मानक SQL हैं। यही है, संकेतन:

 INSERT INTO target_table[(<column-list>)] SELECT ... FROM ...; 

Informix के साथ ठीक काम करता है और, मैं उम्मीद करता हूं, सभी डीबीएमएस (एक बार 5 या उससे अधिक साल पहले, यह ऐसी चीज है जो कि MySQL हमेशा समर्थन नहीं करता था, अब इस तरह के मानक एसक्यूएल वाक्यविन्यास और एएएआईआईके के लिए अच्छा समर्थन है, यह इस नोटेशन पर ठीक काम करेगा।) स्तंभ सूची वैकल्पिक है लेकिन अनुक्रम में लक्ष्य कॉलम इंगित करता है, इसलिए चयन के परिणाम का पहला कॉलम पहले सूचीबद्ध कॉलम, आदि में चलेगा। स्तंभ सूची के अभाव में, चयन के परिणाम का पहला स्तंभ में जाता है लक्ष्य तालिका का पहला स्तंभ

अलग-अलग डेटाबेस में तालिकाओं की पहचान करने के लिए सिस्टम के बीच क्या भिन्न हो सकता है – अंतर-डेटाबेस के बारे में मानक के बारे में कुछ भी नहीं कहना (इंटर-डीबीएमएस की अनुमति दें) संचालन। Informix के साथ, आप एक तालिका की पहचान करने के लिए निम्न संकेतन का उपयोग कर सकते हैं:

 [dbase[@server]:][owner.]table 

यही है, आप एक डेटाबेस निर्दिष्ट कर सकते हैं, वैकल्पिक रूप से उस सर्वर की पहचान कर सकते हैं जो उस डेटाबेस को होस्ट करता है, यदि वह वर्तमान सर्वर में नहीं है, वैकल्पिक स्वामी, डॉट के साथ, और अंत में वास्तविक तालिका नाम। एसक्यूएल मानक शब्द स्कीमा का उपयोग करता है जिसके लिए Informix कॉल करता है स्वामी इस प्रकार, इनफॉर्मिक्स में, निम्न में से कोई भी नोटेशन तालिका की पहचान कर सकता है:

 table "owner".table dbase:table dbase:owner.table dbase@server:table dbase@server:owner.table 

सामान्य तौर पर मालिक को उद्धृत करने की आवश्यकता नहीं है; हालांकि, यदि आप उद्धरण चिह्नों का उपयोग करते हैं, तो आपको मालिक नाम की वर्तनी ठीक से प्राप्त करने की आवश्यकता है – यह मामला-संवेदनशील हो जाता है अर्थात्:

 someone.table "someone".table SOMEONE.table 

सभी एक ही तालिका की पहचान करते हैं इनफॉर्मिक्स के साथ, MODE ANSI डेटाबेस के साथ एक हल्का जटिलता है, जहां मालिक नाम आम तौर पर ऊपरी-केस में परिवर्तित हो जाते हैं (अपरिष्म अपवाद है)। यह है कि, एक MODE एएनएसआई डेटाबेस (आमतौर पर इस्तेमाल नहीं) में, आप लिख सकते हैं:

 CREATE TABLE someone.table ( ... ) 

और सिस्टम कैटलॉग में मालिक का नाम 'किसी' के बजाय '' कुछ '' होगा यदि आप स्वामी के नाम को दोहरे उद्धरण में लगाते हैं, तो यह एक सीमांकित पहचानकर्ता की तरह कार्य करता है। मानक एसक्यूएल के साथ, सीमांकित पहचानकर्ताओं का इस्तेमाल कई स्थानों पर किया जा सकता है। इनफॉर्मिक्स के साथ, आप उन्हें केवल मालिक के नाम के आसपास ही इस्तेमाल कर सकते हैं – अन्य संदर्भों में, इनफॉर्मिक्स एकल-उद्धृत और दोहरे उद्धृत स्ट्रिंग्स को स्ट्रिंग के रूप में मानता है, स्ट्रिंग के रूप में सिंगल-उद्धृत स्ट्रिंग को अलग करने और डबल-उद्धृत स्ट्रिंग्स को सीमांकित आइडेंटिफ़ायर के रूप में। (बेशक, पूर्णता के लिए, एक परिवेश चर, डिलीमीटर, जो कि सेट किया जा सकता है – किसी भी मूल्य के लिए, लेकिन Y सुरक्षित है – यह संकेत देने के लिए कि डबल उद्धरण हमेशा सीमांकित आइडेंटिफ़ायर और एकल उद्धरण हमेशा तारों को घेरते हैं।)

ध्यान दें कि एमएस एसक्यूएल सर्वर का उपयोग करने के लिए प्रबंधित [सीमांकित पहचानकर्ता] वर्ग कोष्ठक में संलग्न है यह मेरे लिए अजीब लग रहा है, और निश्चित रूप से एसक्यूएल मानक का हिस्सा नहीं है।

अधिकांश डेटाबेस मूल वाक्य रचना का पालन करते हैं,

 INSERT INTO TABLE_NAME SELECT COL1, COL2 ... FROM TABLE_YOU_NEED_TO_TAKE_FROM ; 

मैं उपयोग किया है हर डेटाबेस अर्थात्, DB2 , SQL Server , MY SQL , PostgresQL इस वाक्यविन्यास का पालन करें

यदि आप SELECT भाग में सभी कॉलम के लिए मूल्यों की आपूर्ति कर रहे हैं, तो यह भाग में INSERT INTO में कॉलम निर्दिष्ट किए बिना किया जा सकता है।

मान लीजिए कि टेबल 1 में दो कॉलम हैं। इस क्वेरी को काम करना चाहिए:

 INSERT INTO table1 SELECT col1, col2 FROM table2 

यह काम नहीं करेगा ( col2 लिए मान निर्दिष्ट नहीं है):

 INSERT INTO table1 SELECT col1 FROM table2 

मैं एमएस SQL ​​सर्वर का उपयोग कर रहा हूँ मुझे नहीं पता कि अन्य RDMS काम कैसे करते हैं

पहले जवाब में कुछ जोड़ने के लिए, जब हम किसी अन्य तालिका से केवल कुछ रिकॉर्ड चाहते हैं (इस उदाहरण में केवल एक):

 INSERT INTO TABLE1 (COLUMN1, COLUMN2, COLUMN3, COLUMN4) VALUES (value1, value2, (SELECT COLUMN_TABLE2 FROM TABLE2 WHERE COLUMN_TABLE2 like "blabla"), value4); 

जब तालिका स्तंभ अनुक्रम ज्ञात होता है तो सरल प्रविष्टि:

  Insert into Table1 values(1,2,...) 

साधारण सम्मिलन स्तंभ का उल्लेख करना:

  Insert into Table1(col2,col4) values(1,2) 

बल्क प्रविष्टि जब तालिका के चयनित स्तंभों की संख्या (# तालिका2) प्रविष्टि तालिका (तालिका 1) के बराबर होती है

  Insert into Table1 {Column sequence} Select * -- column sequence should be same. from #table2 

बल्क प्रविष्टि जब आप केवल एक तालिका (तालिका 1) के वांछित स्तंभ में डालना चाहते हैं:

  Insert into Table1 (Column1,Column2 ....Desired Column from Table1) Select Column1,Column2..desired column from #table2 from #table2 

यह चयन के साथ मूल्यों का उपयोग करते हुए एक और उदाहरण है:

 INSERT INTO table1(desc, id, email) SELECT "Hello World", 3, email FROM table2 WHERE ... 

यहां बताया गया है कि कैसे एक से अधिक तालिकाओं से सम्मिलित किया जाए। यह एक खास उदाहरण है, जहां कई परिदृश्य में आपके पास मैपिंग तालिका है:

 insert into StudentCourseMap (StudentId, CourseId) SELECT Student.Id, Course.Id FROM Student, Course WHERE Student.Name = 'Paddy Murphy' AND Course.Name = 'Basket weaving for beginners' 

(मुझे पता है कि विद्यार्थी के नाम से मिलान करने से एक से अधिक मान वापस आ सकते हैं लेकिन आपको यह विचार मिलता है। आईडी के अलावा किसी अन्य चीज़ पर मेल करना आवश्यक है जब आईडी एक पहचान कॉलम है और वह अज्ञात है।)

 INSERT INTO yourtable SELECT fielda, fieldb, fieldc FROM donortable; 

यह सभी डीबीएमएस पर काम करता है

आप यह कोशिश कर सकते हैं यदि आप का SELECT * INTO करके सभी स्तंभ सम्मिलित करना चाहते हैं I

 SELECT * INTO Table2 FROM Table1; 

माइक्रोसॉफ्ट एसक्यूएल सर्वर के लिए, मैं एमएसडीएन पर प्रदान की गई SYNTAX की व्याख्या करने की सीख करेगी I सिंटैक्स को देखने के लिए, Google के साथ पहले से कहीं ज्यादा आसान है

इस विशेष मामले के लिए, कोशिश करें

Google: साइट डालें: microsoft.com

पहला परिणाम http://msdn.microsoft.com/en-us/library/ms174335.aspx होगा

उदाहरण के लिए नीचे स्क्रॉल करें ("अन्य तालिकाओं से डेटा सम्मिलित करने के लिए SELECT और EXECUTE विकल्पों का उपयोग करना") यदि आपको पृष्ठ के शीर्ष पर दिया गया सिंटैक्स की व्याख्या करना कठिन है

 [ WITH <common_table_expression> [ ,...n ] ] INSERT { [ TOP ( expression ) [ PERCENT ] ] [ INTO ] { <object> | rowset_function_limited [ WITH ( <Table_Hint_Limited> [ ...n ] ) ] } { [ ( column_list ) ] [ <OUTPUT Clause> ] { VALUES ( { DEFAULT | NULL | expression } [ ,...n ] ) [ ,...n ] | derived_table <<<<------- Look here ------------------------ | execute_statement <<<<------- Look here ------------------------ | <dml_table_source> <<<<------- Look here ------------------------ | DEFAULT VALUES } } } [;] 

यह वहां उपलब्ध किसी भी अन्य RDBMS के लिए लागू होना चाहिए। सभी उत्पादों के लिए सभी वाक्य रचना को याद रखने में कोई मतलब नहीं है IMO

इसके सरल, INSERT क्वेरी के VALUES बजाय, बस नीचे का SELECT क्वेरी का उपयोग SELECT

 INSERT INTO table1 ( column1 , 2, 3... ) SELECT col1, 2, 3... FROM table2 

मैं वास्तव में निम्नलिखित SQL Server 2008 में पसंद करते हैं:

 SELECT Table1.Column1, Table1.Column2, Table2.Column1, Table2.Column2, 'Some String' AS SomeString, 8 AS SomeInt INTO Table3 FROM Table1 INNER JOIN Table2 ON Table1.Column1 = Table2.Column3 

यह सम्मिलित करें () सेट को जोड़ने के चरण को समाप्त करता है, और आप केवल यह चुनते हैं कि कौन सा मान तालिका में जाते हैं

यहां एक और उदाहरण है जहां स्रोत एक से अधिक तालिका का उपयोग कर लिया जाता है:

 INSERT INTO cesc_pf_stmt_ext_wrk( PF_EMP_CODE , PF_DEPT_CODE , PF_SEC_CODE , PF_PROL_NO , PF_FM_SEQ , PF_SEQ_NO , PF_SEP_TAG , PF_SOURCE) SELECT PFl_EMP_CODE , PFl_DEPT_CODE , PFl_SEC , PFl_PROL_NO , PF_FM_SEQ , PF_SEQ_NO , PFl_SEP_TAG , PF_SOURCE FROM cesc_pf_stmt_ext, cesc_pfl_emp_master WHERE pfl_sep_tag LIKE '0' AND pfl_emp_code=pf_emp_code(+); COMMIT; 

यह मेरे लिए काम किया:

 insert into table1 select * from table2 

यह वाक्य ओरेकल के कुछ अलग है।

 select * into tmp from orders 

अच्छा दिखता है, लेकिन केवल तभी काम करता है यदि टीएमपी मौजूद नहीं है (इसे बनाता है और भरता है)। (एसक्यूएल टूवर)

मौजूदा टीएमपी तालिका में डालने के लिए:

 set identity_insert tmp on insert tmp ([OrderID] ,[CustomerID] ,[EmployeeID] ,[OrderDate] ,[RequiredDate] ,[ShippedDate] ,[ShipVia] ,[Freight] ,[ShipName] ,[ShipAddress] ,[ShipCity] ,[ShipRegion] ,[ShipPostalCode] ,[ShipCountry] ) select * from orders set identity_insert tmp off 
  • चयन सारणी में INSERT एक तालिका से डेटा की प्रतिलिपि बनाता है और उसे किसी अन्य तालिका में सम्मिलित करता है।

  • चयन में शामिल करने के लिए आवश्यक है कि स्रोत और लक्ष्य तालिकाओं में डेटा प्रकार मैच लक्ष्य तालिका में मौजूदा रिकॉर्ड अप्रभावित हैं

चयन सिंटैक्स में शामिल करें: –

 INSERT INTO table2 SELECT * FROM table1 WHERE condition; 

चुनें उदाहरण में शामिल करें: –

 INSERT INTO Customers (CustomerName, ContactName, Address, City, PostalCode, Country) SELECT SupplierName, ContactName, Address, City, PostalCode, Country FROM Suppliers; 

यदि आप कई पंक्तियों को सम्मिलित करने के लिए INSERT VALUES मार्ग पर जाते हैं, तो सुनिश्चित करें कि मान को कोष्ठकों का उपयोग करके सेट में सेट करें, ताकि:

 INSERT INTO `receiving_table` (id, first_name, last_name) VALUES (1002,'Charles','Babbage'), (1003,'George', 'Boole'), (1001,'Donald','Chamberlin'), (1004,'Alan','Turing'), (1005,'My','Widenius'); 

अन्यथा MySQL ऑब्जेक्ट्स "कॉलम गिनती मूल्य 1 पर पंक्ति संख्या से मेल नहीं खाती", और जब आप आखिरकार यह समझते हैं कि इसके बारे में क्या करना है तो आप एक तुच्छ पोस्ट लिखेंगे