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




what is sql (14)

@ 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 के साथ काम करेगा।

https://code.i-harness.com

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

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


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


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

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 ( ... )

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

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


किसी अन्य तालिका से बहु मान 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 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
(COLUMN1, COLUMN2, COLUMN3, COLUMN4) 
VALUES (value1, value2, 
(SELECT COLUMN_TABLE2 
FROM TABLE2
WHERE COLUMN_TABLE2 like "blabla"),
value4);

माइक्रोसॉफ्ट एसक्यूएल सर्वर के लिए, मैं एमएसडीएन पर प्रदान किए गए 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 
        }
    }
}
[;]

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


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

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


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

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

INSERT INTO table1
SELECT  col1, col2
FROM    table2

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

INSERT INTO table1
SELECT  col1
FROM    table2

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


यदि आप एकाधिक पंक्तियों को सम्मिलित करने के लिए 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 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 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 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




ansi-sql-92