sql - में डालें...मान(चुनें...से...)




database syntax database-agnostic ansi-sql-92 (18)

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

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


Answers

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

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

INSERT क्वेरी के VALUES भाग के बजाय यह सरल है, बस नीचे दिए गए SELECT क्वेरी का उपयोग SELECT

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

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

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


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

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


FIRST_TABLE_NAME (COLUMN_NAME) में INSERT जब कोई शर्त_TABLE_NAME से COLUMN_NAME चुनें;


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

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

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

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

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

[ 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 
        }
    }
}
[;]

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


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 INTO table1 ( column1 )
SELECT  col1
FROM    table2  

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

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

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

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

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

INSERT INTO table1
SELECT  col1, col2
FROM    table2

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

INSERT INTO table1
SELECT  col1
FROM    table2

मैं एमएस एसक्यूएल सर्वर का उपयोग कर रहा हूँ। मुझे नहीं पता कि अन्य आरडीएमएस कैसे काम करते हैं।


इन दोनों उत्तरों में विशेष रूप से इनफॉर्मिक्स में ठीक काम करता है, और मूल रूप से मानक एसक्यूएल हैं। यही है, नोटेशन:

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

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

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

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

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

table
"owner".table
dbase:table
dbase:owner.table
[email protected]:table
[email protected]:owner.table

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

someone.table
"someone".table
SOMEONE.table

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

CREATE TABLE someone.table ( ... )

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

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


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

SELECT  *
INTO    Table2
FROM    Table1;

किसी अन्य तालिका से बहु मान 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))

अधिकांश डेटाबेस बुनियादी वाक्यविन्यास का पालन करते हैं,

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

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


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

    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

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

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

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


यदि आप एकाधिक पंक्तियों को सम्मिलित करने के लिए 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 पर मूल्य गणना से मेल नहीं खाती है", और जब आप आखिरकार पता लगाते हैं कि इसके बारे में क्या करना है, तो आप एक छोटी सी पोस्ट लिखना समाप्त कर देते हैं।


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

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

INSERT बयान जो VALUES वाक्यविन्यास का उपयोग करते हैं, कई पंक्तियां डाल सकते हैं। ऐसा करने के लिए, कॉलम मानों की एकाधिक सूचियों को शामिल करें, प्रत्येक कोष्ठक के भीतर संलग्न और अल्पविराम से अलग करें।

उदाहरण:

INSERT INTO tbl_name (a,b,c) VALUES(1,2,3),(4,5,6),(7,8,9);




sql database syntax database-agnostic ansi-sql-92