प्रश्नकर्ता जो कुछ भी माँग रहा है, मैं उसे यहाँ नहीं बोल सकता क्योंकि यह कोई भी . नहीं बनाता है भाव।
तो चलिए एक अलग समस्या मानते हैं:
इसके बजाय, मान लें कि मेरे पास एक हीप-टेबल है जिसमें कोई पहचान-फ़ील्ड नहीं है, लेकिन इसमें "विज़िट है " दिनांक फ़ील्ड.
हीप-टेबल लॉग व्यक्ति वेबपेज विज़िट करता है और मैं इसे अपने डेटा वेयरहाउस में लोड कर रहा हूं।
इस डेटा वेयरहाउस में मैं सरोगेट-कुंजी का उपयोग करना चाहता हूं "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 टॉप के साथ और बिना टॉप के।