POKUD EXISTUJE a SLOUČIT Prohlášení

0

Otázka

Mám data proudící do jedné tabulky z více jiných tabulek umožňuje říct: Table_A Pak mám Sloučit uložené proc to bere data z tabulky A spojuje ji s Tabulkou B.

Nicméně, něco, co se nezdá být správné. Pokud jsem zkrátit a načtení dat funguje to v pohodě, ale když jsem dont zkrátit a zatížení, a jen načtení dotazu do eachh hodinu se mi chybová zpráva, že

Msg 8672, Úroveň 16, Stav 1, Postup Merge_Table_A, Řádek 4 [Batch Start 0] SLOUČENÍ prohlášení pokusil AKTUALIZOVAT nebo ODSTRANIT stejném řádku více než jednou. To se stane, když cíl řádek odpovídá více než jeden zdrojový řádek. SLOUČENÍ prohlášení nelze AKTUALIZOVAT/SMAZAT stejném řádku cílové tabulky vícekrát. Upřesnění klauzule ON zajistit cílového řádku odpovídá maximálně jeden zdrojový řádek, nebo pomocí GROUP BY klauzule group zdroj řádků.

Jak mohu překonat?

Chci být schopen postupně načíst data a ne zkrátit zatížení, ale zároveň máte uložené proc který aktualizuje nebo vloží, nebo jedno, je-li řádek již existuje.

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

Nejlepší odpověď

1

Zdá se, že máte duplicitní řádky ve vaší cílové tabulky, které jsou načteny z vašich předchozích běhů.

Poznámka: Odpovídající Slučovací nepovažuje řádků, které jsou vloženy (i duplicitní), zatímco běží Sloučení sám.

Níže je moje repro příklad s ukázková data:

Tabulka1: Počáteční data

enter image description here

Tabulka2: Taget stůl

enter image description here

Sloučit Prohlášení:

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;

Při Sloučení provede, to vloží všechny údaje bez jakéhokoliv chyby.

enter image description here

Nové údaje v tb1:

enter image description here

Když jsem se spustit Sloučení prohlášení, to mi dává stejnou chybu jako vy.

enter image description here

Jako řešení pomocí jednoho z níže uvedených možností,

  1. Přidat další podmínky, pokud je to možné v bodě jednoznačně identifikovat data.

  2. Odstranit duplicity od zdroje a sloučení dat do tb2, jak je uvedeno níže.

     --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;
    

Údaje sloučeny do tb2 úspěšně.

enter image description here

2021-12-02 12:52:40

V jiných jazycích

Tato stránka je v jiných jazycích

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