2011-11-27 21 views
5

परिदृश्यएसक्यूएल में रिक्त मूल्यों के साथ रिकॉर्ड कैसे सम्मिलित करें?

मैं एक स्प्रेडशीट (एकमात्र विकल्प उपलब्ध है) के माध्यम से दैनिक एक एसक्यूएल 2008 डेटाबेस अद्यतन करने की जरूरत है। प्रारूप बहुत बुनियादी है, हालांकि संभावित रूप से लाखों रिकॉर्ड हैं। कॉलम 1 और कॉलम 3 में कई पूर्वनिर्धारित डुप्लिकेट मान होंगे, जो पहले से ही अलग-अलग तालिकाओं में खींचे गए हैं।

स्प्रेडशीट नमूना

Column1 Column2 Column3 
Apple 10  Red 
Apple 20  Red 
Apple 15  Blue 
Apple 21  Green 
Orange 10  Orange 
Orange 7  Orange 
Orange 9  Red 
Orange 70  Blue 
Orange 10  Blue 

डीबी सेटअप

मेरे डेटाबेस तीन अलग-अलग तालिकाओं के साथ की स्थापना की है:

//Lookup_Column1 
id type 
1 Apple 
2 Orange 

//Lookup_Column3 
id type 
1 Red 
2 Blue 
3 Green 
4 Orange 

//Main - this is what should be inserted, after Column1 
//and Column2 are matched to their respective ID's 
key Column1 Column2 Column3 
1 1  10  1 
2 1  20  1 
3 1  15  2 
4 1  21  3 
5 2  10  4 
6 2  7  4 
7 2  9  1 
8 2  70  2 
9 2  10  2 

प्रश्न

लुकअप टेबल से जानकारी से मेल खाने वाले रिकॉर्ड डालने के लिए मैं SQL कैसे लिख सकता हूं? मैं इस से कैसे जा सकते हैं:

INSERT INTO Main(Column1, Column2) VALUES ('Apple', 10, 'Red'); 

इस के लिए:

INSERT INTO Main(Column1, Column2) VALUES (1, 10, 1); 
//pulled from lookup tables, where Apple = 1 and Red = 1 
+0

आप स्प्रैडशीट डेटा को SQL सर्वर में लाने की योजना कैसे बनाते हैं? –

उत्तर

5

आप कुछ इस तरह की कोशिश कर सकते:

INSERT INTO Main(Column1, Column2, Column3) VALUES 
    (
    (SELECT id FROM Lookup_Column1 WHERE type = 'Apple'), 
    10, 
    (SELECT id FROM Lookup_Column3 WHERE type = 'Red') 
    ); 

कोई गलती सहिष्णुता नहीं है, लेकिन यह जब तक आप SELECT स्टेटमेंट्स में अपनी स्प्रेडशीट मूल्यों को पार्स सकता है के रूप में काम करेगा।

+0

धन्यवाद! यह चाल, छोटी और मीठी थी। – Paul

0

आप एक का चयन करें जांच कथन का उपयोग करने की कोशिश की है? यह आपको एक टेबल से डेटा का चयन करने और इसे दूसरे में डालने की अनुमति देता है।

http://www.w3schools.com/sql/sql_select_into.asp

+0

चुनें * * एक टेबल बनाता है –

2

आंकड़ों का स्रोत है कि एक तालिका में सम्मिलित तो हम एक derived_table जो

derived_table के रूप में परिभाषित किया गया है के रूप में उपयोग कर सकते हैं

VALUES ({ DEFAULT | NULL | expression } [ ,...n ]) [ ,...n ] 
      | derived_table 
      | execute_statement 
      | <dml_table_source> 
      | DEFAULT VALUES 

परिभाषित किया गया है

कोई मान्य SELECT कथन है जो वापस आता है तालिका में लोड होने के लिए डेटा की पंक्तियां। SELECT कथन में सामान्य तालिका अभिव्यक्ति (सीटीई) नहीं हो सकती है।

INSERT INTO 
    MAIN 
(Column1, Column2, column3) 

SELECT 
    lc1.id, 
    10, 
    lc2.id 
FROM 
    Lookup_Column1 lc1, 
    Lookup_Column2 lc2 
    WHERE 
    lc1.type = 'Apple' 
    and 
    lc2.type = 'Red' 

अधिक जानकारी के लिए देख INSERT (Transact-SQL)

आप एक मचान तालिका में अपनी स्प्रेडशीट मूल्यों को प्राप्त कर सकता है (या सीधे किसी लिंक किए गए सर्वर या OPENDATASOURCE का उपयोग कर स्प्रेडशीट से जुड़ा हुआ) यदि आप करने के लिए अपने सम्मिलित खंड को बदल सकता है

INSERT INTO 
    MAIN 
    (Column1, Column2, column3) 
SELECT 
    lc1.id, 
    s.column2, 
    lc2.id 

FROM 
    OPENDATASOURCE('Microsoft.Jet.OLEDB.4.0', 
      'Data Source=C:\YourdataSource.xls;Extended Properties=EXCEL 5.0')...[Sheet1$] s 
    INNER JOIN Lookup_Column1 lc1 
    ON s.column1 = lc1.type 
    INNER JOIN Lookup_Column2 lc2 
    ON s.column3 = lc2.type 

यह आपको उस लूपिंग को हटाने की अनुमति देगा जो आप वर्तमान में करने के बारे में सोच रहे हैं।

+0

यह BryceAtNetwork23 के उत्तर से बेहतर कैसे है, जो मेरे लिए आसान लगता है? (हालांकि दोनों जवाब काम करते हैं) – Paul

+0

यदि आप एक समय में रिकॉर्ड्स को संसाधित करने जा रहे हैं तो वे वही हैं। यदि आप एक बार में सभी को संसाधित करने के लिए स्टेजिंग तालिका या OPENDATASOURCE का उपयोग करते हैं तो आपको एक व्युत्पन्न_टेबल –

+0

समझना होगा, और आपकी सहायता के लिए धन्यवाद। दुर्भाग्यवश आपकी विधि मेरे लिए उपलब्ध नहीं है। – Paul

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