Sqlserver
 sql >> डेटाबेस >  >> RDS >> Sqlserver

सम्मिलन आदेश में मर्ज करें

प्रश्नकर्ता जो कुछ भी माँग रहा है, मैं उसे यहाँ नहीं बोल सकता क्योंकि यह कोई भी . नहीं बनाता है भाव।

तो चलिए एक अलग समस्या मानते हैं:

इसके बजाय, मान लें कि मेरे पास एक हीप-टेबल है जिसमें कोई पहचान-फ़ील्ड नहीं है, लेकिन इसमें "विज़िट है " दिनांक फ़ील्ड.
हीप-टेबल लॉग व्यक्ति वेबपेज विज़िट करता है और मैं इसे अपने डेटा वेयरहाउस में लोड कर रहा हूं।
इस डेटा वेयरहाउस में मैं सरोगेट-कुंजी का उपयोग करना चाहता हूं "WebHitID " इन ​​संबंधों को संदर्भित करने के लिए।
चलो तालिका का प्रारंभिक लोड करने के लिए मर्ज का उपयोग करें, फिर तालिकाओं को समन्वयित रखने के लिए इसे कॉल करना जारी रखें।

मुझे पता है कि यदि मैं रिकॉर्ड सम्मिलित कर रहा हूं एक तालिका में, तो मैं जो भी ऑर्डर-बाय मैं चुनता हूं, उसके आधार पर अनुक्रमिक होने के लिए आईडी (जो एक पहचान-क्षेत्र द्वारा उत्पन्न किया जा रहा है) को पसंद करेंगे (मान लें कि "विजिटेड " दिनांक).
किसी पूर्णांक-आईडी के तालिका में शेष रिकॉर्ड के संबंध में बनाए जाने के समय से संबंधित होने की अपेक्षा करना असामान्य नहीं है।
मुझे पता है कि यह हमेशा 100% मामला नहीं होता है , लेकिन एक पल के लिए मेरा मजाक उड़ाओ।

मर्ज के साथ यह संभव है।

उपयोग करना (एक हैक जैसा क्या लगता है) ) TOP हमारे निवेशन में छँटाई की अनुमति देगा:

MERGE DW.dbo.WebHit AS Target --This table as an Identity Field called WebHitID.
USING
(
    SELECT TOP 9223372036854775807 --Biggest BigInt (to be safe).
           PWV.PersonID, PWV.WebPageID, PWV.Visited
      FROM ProdDB.dbo.Person_WebPage_Visit AS PWV
     ORDER BY PWV.Visited --Works only with TOP when inside a MERGE statement.
) AS Source
  ON Source.PersonID  = Target.PersonID
 AND Source.WebPageID = Target.WebPageID
 AND Source.Visited   = Target.Visited
WHEN NOT MATCHED BY Target THEN --Not in Target-Table, but in Source-Table.
    INSERT (PersonID, WebPageID, Visited) --This Insert populates our WebHitID.
    VALUES (Source.PersonID, Source.WebPageID, Source.Visited)
WHEN NOT MATCHED BY Source THEN --In Target-Table, but not in Source-Table.
    DELETE --In case our WebHit log in Prod is archived/trimmed to save space.
;


आप देख सकते हैं कि मैंने सब कुछ खींचने के लिए TOP 9223372036854775807 (सबसे बड़ा पूर्णांक है) का उपयोग करने का विकल्प चुना है।
यदि आपके पास इससे अधिक मर्ज करने के लिए संसाधन हैं, तो आपको इसे बाहर कर देना चाहिए।
जबकि यह चिल्लाता है "हैकी वर्कअराउंड " मेरे लिए, यह आपको वहां ले जाना चाहिए जहां आपको जाने की आवश्यकता है।

मैंने एक छोटे से नमूना सेट पर इसका परीक्षण किया है और सत्यापित किया है कि यह काम करता है। मैंने बड़े जटिल सेटों पर इसके प्रदर्शन प्रभाव का अध्ययन नहीं किया है। डेटा हालांकि, इसलिए YMMV टॉप के साथ और बिना टॉप के।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL सर्वर में आपातकालीन मोड से डेटाबेस पुनर्प्राप्त करें

  2. अनुरोध विफल रहा या सेवा ने समय पर प्रतिक्रिया नहीं दी?

  3. SQL में बूल वैल्यू कैसे सेट करें

  4. एसक्यूएल में यादृच्छिक नाम उत्पन्न करें

  5. विंडोज़ पर SQL सर्वर कैसे स्थापित करें