अगर मौजूद है, और मर्ज कथन

0

सवाल

मैं डेटा में बह रही एक टेबल से दूसरे टेबल कह देता है: Table_A तो मैं एक विलय संग्रहीत proc लेता है कि डेटा तालिका से एक विलीन हो जाती है, यह टेबल के साथ बी.

हालांकि, कुछ प्रतीत नहीं होता है करने के लिए सही हो सकता है. अगर मैं काटना और डेटा लोड यह ठीक काम करता है, लेकिन अगर मैं न काटना और लोड, और सिर्फ लाने के लिए क्वेरी द्वारा eachh घंटे मैं कह त्रुटि संदेश मिल

Msg 8672, स्तर 16, राज्य 1, प्रक्रिया Merge_Table_A, लाइन 4 [बैच शुरू लाइन 0] मर्ज कथन का प्रयास करने के लिए अद्यतन या हटाना एक ही पंक्ति में एक बार से अधिक. यह तब होता है जब एक लक्ष्य पंक्ति से मेल खाता एक से अधिक स्रोत पंक्ति. किसी मर्ज कथन अद्यतन नहीं कर सकता/हटाने के लिए एक ही पंक्ति का लक्ष्य तालिका में कई बार. को निखारने पर खंड सुनिश्चित करने के लिए एक लक्ष्य पंक्ति मैचों में सबसे अधिक एक पंक्ति में, या उपयोग समूह द्वारा खंड समूह के लिए स्रोत पंक्तियों.

कैसे कर सकते हैं मैं इस पर काबू पाने?

मैं चाहता हूँ करने के लिए सक्षम होना करने के लिए संवर्द्धित डेटा लोड और नहीं truncate भार है, लेकिन एक ही समय में एक संग्रहीत proc है कि अद्यतन या सम्मिलित करता है या परवाह नहीं करता, तो पंक्ति में पहले से ही मौजूद है ।

azure sql-merge sql-server
2021-11-24 01:52:34
1

सबसे अच्छा जवाब

1

लगता है आप डुप्लिकेट पंक्तियों में अपने लक्ष्य तालिका में लोड कर रहे हैं जो अपने पिछले से चलाता है ।

नोट: मिलान में एक विलय पर विचार नहीं करता पंक्तियों डाला (यहां तक कि डुप्लिकेट) चल रहा है, जबकि मर्ज ही है ।

नीचे है मेरी रेप्रो उदाहरण के साथ एक नमूना डेटा:

Table1: प्रारंभिक डेटा

enter image description here

Table2: टार्गेट टेबल

enter image description here

मर्ज कथन:

MERGE tb2 AS Target
USING tb1   AS Source
 ON Source.firstname = Target.firstname and 
    Source.lastname = Target.lastname 

-- For Inserts
WHEN NOT MATCHED BY Target THEN
INSERT (firstname, lastname, updated_date) 
VALUES (Source.firstname, Source.lastname, source.updated_date)

-- For Updates
WHEN MATCHED THEN UPDATE SET
   Target.updated_date      = Source.updated_date

-- For Deletes
WHEN NOT MATCHED BY Source THEN
DELETE;

जब मर्ज में मार डाला है, यह सम्मिलित करता है सभी डेटा किसी भी त्रुटि के बिना.

enter image description here

नए डेटा में tb1:

enter image description here

जब मैं चलाने के विलय का बयान, यह मुझे देता है एक ही त्रुटि के रूप में तुम्हारा है ।

enter image description here

एक समाधान के रूप में एक का उपयोग कर के नीचे दिए गए विकल्पों में,

  1. जोड़ने अतिरिक्त स्थिति में यदि संभव हो तो पर खंड के लिए विशिष्ट रूप से पहचान डेटा.

  2. निकालें डुप्लिकेट से स्रोत और डेटा मर्ज में tb2 के रूप में नीचे.

     --temp table
     drop table if exists #tb1;
    
     select *  into #tb1 from (
         select *, row_number() over(partition by firstname, lastname order by firstname, lastname, updated_date desc) as rn from tb1) a
     where rn = 1 
    
     MERGE tb2 AS Target
     USING #tb1 AS Source
      ON Source.firstname = Target.firstname and 
         Source.lastname = Target.lastname 
    
     -- For Inserts
     WHEN NOT MATCHED BY Target THEN
     INSERT (firstname, lastname, updated_date) 
       VALUES (Source.firstname, Source.lastname, source.updated_date)
    
     -- For Updates
     WHEN MATCHED THEN UPDATE SET
        Target.updated_date     = Source.updated_date
    
     -- For Deletes
     WHEN NOT MATCHED BY Source THEN
       DELETE;
    

डेटा में विलय tb2 सफलतापूर्वक ।

enter image description here

2021-12-02 12:52:40

अन्य भाषाओं में

यह पृष्ठ अन्य भाषाओं में है

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................

इस श्रेणी में लोकप्रिय

लोकप्रिय सवाल इस श्रेणी में