मूल्यों में सम्मिलित करें ... (चयन करें ... से ...)


1426

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

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


1
यह उदाहरण काम करता है: tag_zone में डालें @ टैग, ज़ोनिड, GETDATE (), @ positiong.STIntersects (बहुभुज) ज़ोन से
Uüur Gümüşhan

जवाबों:


1611

प्रयत्न:

INSERT INTO table1 ( column1 )
SELECT  col1
FROM    table2  

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

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

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

944

क्लाउड हौले का जवाब : ठीक काम करना चाहिए, और आपके पास कई कॉलम और अन्य डेटा भी हो सकते हैं:

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 के साथ भी काम करना चाहिए।


1
क्या होगा, जहां स्थिति तालिका 2 में बदल गई है। एक से अधिक पंक्तियों की संख्या और रिटर्न की संख्या बढ़ाएं? मुझे यहाँ भी ऐसा ही मुद्दा मिला: stackoverflow.com/questions/36030370/…
vijayrana

1
एक से अधिक पंक्ति सम्मिलित करने में कोई समस्या नहीं होनी चाहिए।
rinukkusu

क्या यह आवश्यक है कि हम तालिका के सभी स्तंभों में सम्मिलित हों
महेशमंज

1
@maheshmnj नहीं, केवल स्तंभ जो NULL के लिए सेट नहीं हैं और कोई डिफ़ॉल्ट मान शामिल करने की आवश्यकता नहीं है, किसी भी अन्य कॉलम को उनके डिफ़ॉल्ट मानों या NULL
travis

जानकारी के लिए धन्यवाद
महेशमंज

148

INSERTSQLite3 में मैंने निम्न तालिका से एक बहु मूल्य में केवल एक मान प्राप्त करने के लिए :

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

4
स्पष्टीकरण के लिए: यह SQLite3 के लिए गलत है। के अनुसार प्रलेखन , के लिए स्रोत डेटा INSERTहै या तो VALUES या एक SELECTबयान, दोनों नहीं।

2
यह सच है कि प्रलेखन इसे सूचीबद्ध नहीं करता है, लेकिन यह काम करता है। बावजूद, मुझे लगता है कि मूल्यों के बजाय चुनिंदा बयान का उपयोग करना इसे और अधिक पठनीय बनाता है।
बंजोकट

1
यह एक पंक्ति के अंदर एक मूल्य निर्दिष्ट करने के लिए काम करता है, लेकिन अधिक सामान्य मामले में बहुत सारी पंक्तियों को प्राप्त करने की आवश्यकता होती है।
लुचोस्तिन

यदि val_1 पंक्तियों में नहीं बदलता है, तो SQLite3 में निम्नलिखित सिंटैक्स काम कर सकता है? 'फू' चुनें, some_table से some_column - SQLServer 2014 में काम करता है
क्रिस B

दस्तावेज़ीकरण इसे (अब?) सूचीबद्ध करता है: यह वाक्यविन्यास है INSERT INTO ... VALUES ([expr], [expr], ...)और इसमें एक पथ [expr]है {{NOT} EXISTS} ([select-stmt])- ध्यान दें कि चयनित कथन के चारों ओर {}
परिकल्पना

64

दोनों उत्तर मुझे विशेष रूप से Informix में ठीक दिखाई देते हैं, और मूल रूप से मानक SQL हैं। वह है, संकेतन:

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

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

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

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

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

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

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

someone.table
"someone".table
SOMEONE.table

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

CREATE TABLE someone.table ( ... )

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

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


40

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

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

4
यह दृष्टिकोण केवल ऐसे उपशम पर लागू होता है जिसमें केवल एक कॉलम चुना जाता है। कई-कॉलम उप-प्रश्न के मामले में, एक त्रुटि 'सबक्वेरी को केवल एक कॉलम वापस करना होगा' को उठाया जाएगा। @ ट्रैविस के उत्तर को तब अपनाएं।
स्नोफ़ॉक्स

34

अधिकांश डेटाबेस मूल सिंटैक्स का अनुसरण करते हैं,

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

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


34

क्वेरी के VALUESभाग के बजाय INSERT, SELECTनीचे दिए अनुसार क्वेरी का उपयोग करें।

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

32

सम्मिलित उप-क्वेरी के साथ सम्मिलित करने के लिए दो दृष्टिकोण।

  1. एक पंक्ति के साथ चयनित उप-रिटर्निंग परिणाम के साथ ।
  2. एकाधिक पंक्तियों के साथ चयनित उप-रिटर्निंग परिणाम ।

1. एक पंक्ति के साथ चयनित उप-रिटर्निंग परिणामों के साथ दृष्टिकोण ।

INSERT INTO <table_name> (<field1>, <field2>, <field3>) 
VALUES ('DUMMY1', (SELECT <field> FROM <table_name> ),'DUMMY2');

इस स्थिति में, यह चुनिंदा उप-क्वेरी को परिणाम की केवल एक पंक्ति देता है जहां WHUM शर्त या SQL सकल कार्य जैसे SUM, MAX, AVG इत्यादि के आधार पर रिटर्न देता है अन्यथा यह त्रुटि फेंक देगा।

2. कई पंक्तियों के साथ चयनित उप-रिटर्निंग परिणामों के साथ दृष्टिकोण ।

INSERT INTO <table_name> (<field1>, <field2>, <field3>) 
SELECT 'DUMMY1', <field>, 'DUMMY2' FROM <table_name>;

दूसरा दृष्टिकोण दोनों मामलों के लिए काम करेगा।


29

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

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

INSERT INTO table1
SELECT  col1, col2
FROM    table2

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

INSERT INTO table1
SELECT  col1
FROM    table2

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


24

यह चुनिंदा मानों का उपयोग करके एक और उदाहरण है:

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

पुराना उत्तर और फिर भी उपयोगी। बहुत सरल और स्पष्ट लेकिन वास्तव में मेरी जरूरतों को शामिल किया गया। धन्यवाद!
सेबेस्टियन काकज़मारेक

21

तालिका स्तंभ अनुक्रम ज्ञात होने पर सरल सम्मिलन:

    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

17

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

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;

17

बस के लिए कोष्ठक का उपयोग का चयन करें सम्मिलित करें में खंड। इस तरह के उदाहरण के लिए:

INSERT INTO Table1 (col1, col2, your_desired_value_from_select_clause, col3)
VALUES (
   'col1_value', 
   'col2_value',
   (SELECT col_Table2 FROM Table2 WHERE IdTable2 = 'your_satisfied_value_for_col_Table2_selected'),
   'col3_value'
);

धन्यवाद @ दास मेरे लिए यह काम कर रहा है ....
राज जी

16

यहाँ कई तालिकाओं से सम्मिलित करने का तरीका बताया गया है। यह विशेष उदाहरण है कि आपके पास एक मैपिंग टेबल है जिसमें कई से कई परिदृश्य हैं:

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'

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


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

यह सभी DBMS पर काम करता है


14

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

SELECT  *
INTO    Table2
FROM    Table1;

13

मैं वास्तव में 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

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


13

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

insert into table1 select * from table2

वाक्य ओरेकल से थोड़ा अलग है।


12

Microsoft SQL सर्वर के लिए, मैं MSDN पर उपलब्ध SYNTAX की व्याख्या करने के लिए सीखने की सलाह दूंगा। 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 
        }
    }
}
[;]

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


मैं पूरी तरह से असहमत हूं, मैं वर्षों से उन वाक्यविन्यास बयानों को देख रहा हूं और अभी भी उनमें से सिर या पूंछ नहीं बना सकता। उदाहरण बहुत अधिक उपयोगी हैं
रेग

यह कोई जवाब नहीं है, यह कह रहा है "डॉक्स पढ़ें" और इसके बारे में है
18

12
INSERT INTO FIRST_TABLE_NAME (COLUMN_NAME)
SELECT  COLUMN_NAME
FROM    ANOTHER_TABLE_NAME 
WHERE CONDITION;

@ggorlen यह मुझे बहुत स्पष्ट लग रहा है
रेगैगिटेरिट

इसे कोड-ओनली उत्तर के रूप में समीक्षा कतार में ध्वजांकित किया गया था। मैं आपकी बात यहां देख सकता हूं, हालांकि - इस पृष्ठ पर अब अधिकांश उत्तरों के संदर्भ में कहने के लिए बहुत कुछ नहीं है कि मैं इसे अपने प्राकृतिक वातावरण में देख रहा हूं।
गोरगलेन

9
select *
into tmp
from orders

अच्छा लग रहा है, लेकिन केवल तभी काम करता है जब tmp मौजूद नहीं है (इसे बनाता है और भरता है)। (SQL गंभीर)

मौजूदा tmp तालिका में सम्मिलित करने के लिए:

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

9

किसी भी अन्य तालिकाओं से कई रिकॉर्ड सम्मिलित करने का सबसे अच्छा तरीका है।

INSERT  INTO dbo.Users
            ( UserID ,
              Full_Name ,
              Login_Name ,
              Password
            )
            SELECT  UserID ,
                    Full_Name ,
                    Login_Name ,
                    Password
            FROM    Users_Table
            (INNER JOIN / LEFT JOIN ...)
            (WHERE CONDITION...)
            (OTHER CLAUSE)

2

यदि आप कई पंक्तियों को सम्मिलित करने के लिए INSERT VALUES मार्ग पर जाते हैं, तो सुनिश्चित करें कि कोष्ठक का उपयोग करके सेटों में 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 पर मूल्य गणना से मेल नहीं खाती है", और आप अंत में एक तुच्छ पोस्ट लिखना समाप्त करते हैं जब आप अंततः यह पता लगाते हैं कि इसके बारे में क्या करना है।


6
सवाल है " किसी अन्य तालिका से इनपुट का उपयोग करके एक तालिका में डालें "। आपका उत्तर इस प्रश्न को कैसे संबोधित करता है?
गुणवत्ता उत्प्रेरक

3
एह उस पर बहुत मुश्किल मत बनो। यह मेरे सवाल का जवाब दिया जब मैं चारों ओर गुगली कर रहा था। @QualityCatalyst
कैमरून बेल्ट



0

यदि आप स्तंभ नाम लिखना चाहते हैं, तो बिना तालिका में कुछ डेटा सम्मिलित करना चाहते हैं।

INSERT INTO CUSTOMER_INFO
   (SELECT CUSTOMER_NAME,
           MOBILE_NO,
           ADDRESS
      FROM OWNER_INFO cm
     WHERE ID>100)

जहां टेबल हैं:

            CUSTOMER_INFO               ||            OWNER_INFO
----------------------------------------||-------------------------------------
CUSTOMER_NAME | MOBILE_NO | ADDRESS     || CUSTOMER_NAME | MOBILE_NO | ADDRESS 
--------------|-----------|---------    || --------------|-----------|--------- 
      A       |     +1    |   DC        ||       B       |     +55   |   RR  

परिणाम:

            CUSTOMER_INFO               ||            OWNER_INFO
----------------------------------------||-------------------------------------
CUSTOMER_NAME | MOBILE_NO | ADDRESS     || CUSTOMER_NAME | MOBILE_NO | ADDRESS 
--------------|-----------|---------    || --------------|-----------|--------- 
      A       |     +1    |   DC        ||       B       |     +55   |   RR
      B       |     +55   |   RR        ||
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.