INSERT INTO और / CTE के साथ संयोजन


157

मेरे पास एक बहुत ही जटिल सीटीई है और मैं परिणाम को एक भौतिक तालिका में सम्मिलित करना चाहूंगा।

निम्नलिखित मान्य है?

INSERT INTO dbo.prf_BatchItemAdditionalAPartyNos 
(
    BatchID,
    AccountNo,
    APartyNo,
    SourceRowID
)       
WITH tab (
  -- some query
)    
SELECT * FROM tab

मैं इस सीटीई को बनाने के लिए एक फ़ंक्शन का उपयोग करने के बारे में सोच रहा हूं जो मुझे पुन: उपयोग करने की अनुमति देगा। कोई विचार?

जवाबों:


271

आपको पहले CTE को डालने की जरूरत है और फिर INSERT INTO को अपने चुनिंदा स्टेटमेंट के साथ मिलाना है। इसके अलावा, CTE के नाम के बाद "AS" कीवर्ड वैकल्पिक नहीं है:

WITH tab AS (
    bla bla
)
INSERT INTO dbo.prf_BatchItemAdditionalAPartyNos (
BatchID,
AccountNo,
APartyNo,
SourceRowID
)  
SELECT * FROM tab

कृपया ध्यान दें कि कोड मानता है कि सीटीई बिल्कुल चार फ़ील्ड लौटाएगा और उन फ़ील्ड्स क्रम में मेल खा रहे हैं और INSERT स्टेटमेंट में निर्दिष्ट लोगों के साथ टाइप करते हैं। यदि ऐसा नहीं है, तो बस उन क्षेत्रों के एक विशिष्ट चयन के साथ "सेलेक्ट *" को बदलें, जिनकी आपको आवश्यकता है।

एक समारोह का उपयोग करने पर आपके प्रश्न के लिए, मैं कहूंगा कि "यह निर्भर करता है"। यदि आप डेटा को केवल प्रदर्शन कारणों के कारण तालिका में रख रहे हैं, और फ़ंक्शन के माध्यम से उपयोग करते समय गति स्वीकार्य है, तो मैं फ़ंक्शन को एक विकल्प मानता हूं। दूसरी ओर, यदि आपको कई अलग-अलग प्रश्नों में सीटीई के परिणाम का उपयोग करने की आवश्यकता है, और गति पहले से ही एक मुद्दा है, तो मैं एक तालिका (या तो नियमित या अस्थायी) के लिए जाऊंगा।

Common_table_expression (Transact-SQL) के साथ


19

WITHके लिए आम टेबल भाव खंड शीर्ष पर चलते हैं।

CTE में हर इंसर्ट को लपेटने से कॉलम मैपिंग से क्वेरी लॉजिक को अलग करने का फायदा होता है।

गलती को दूर करें:

WITH _INSERT_ AS (
  SELECT
    [BatchID]      = blah
   ,[APartyNo]     = blahblah
   ,[SourceRowID]  = blahblahblah
  FROM Table1 AS t1
)
INSERT Table2
      ([BatchID], [SourceRowID], [APartyNo])
SELECT [BatchID], [APartyNo], [SourceRowID]   
FROM _INSERT_

वही गलती:

INSERT Table2 (
  [BatchID]
 ,[SourceRowID]
 ,[APartyNo]
)
SELECT
  [BatchID]      = blah
 ,[APartyNo]     = blahblah
 ,[SourceRowID]  = blahblahblah
FROM Table1 AS t1

बॉयलरप्लेट की कुछ पंक्तियों को सही क्रम में स्तंभों की सही संख्या सम्मिलित करते हुए सत्यापित करना बहुत आसान हो जाता है, यहां तक ​​कि बहुत बड़ी संख्या में स्तंभों के साथ भी। आपका भविष्य स्वयं आपको बाद में धन्यवाद देगा।


3
यह भी खूब रही! अचानक, मैं INSERT के बयानों से बहुत नफरत नहीं करता ...
NReilingh

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

16

हां:

WITH tab (
  bla bla
)

INSERT INTO dbo.prf_BatchItemAdditionalAPartyNos (  BatchID,                                                        AccountNo,
APartyNo,
SourceRowID)    

SELECT * FROM tab

ध्यान दें कि यह SQL सर्वर के लिए है, जो कई सीटीई का समर्थन करता है:

WITH x AS (), y AS () INSERT INTO z (a, b, c) SELECT a, b, c FROM y

Teradata केवल एक CTE की अनुमति देता है और वाक्यविन्यास आपके उदाहरण के रूप में है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.