SE ESISTE e Istruzione MERGE

0

Domanda

Ho il flusso dei dati in una tabella da più di altre tabelle permette di dire: Table_A Poi ho un Merge stored proc che prende i dati da Una tabella che si fonde con la Tabella B.

Tuttavia, qualcosa sembra non essere di destra. Se io di troncare e di caricare i dati e funziona bene, ma se io non troncare e di carico, e recuperare solo le query da ciascunomaglia ora ho il messaggio di errore che dice

Msg 8672, Livello 16, Stato 1, Procedura Merge_Table_A, Linea 4 [Batch Linea Di Partenza 0] L'istruzione MERGE tentato di AGGIORNARE o ELIMINARE la riga stessa più di una volta. Questo accade quando una riga di destinazione corrisponde a più di una riga di origine. Un'istruzione MERGE non è possibile AGGIORNARE/ELIMINARE la stessa riga della tabella di destinazione più volte. Perfezionare la clausola per garantire una riga di destinazione corrisponde al massimo una riga di origine, o utilizzare la clausola GROUP BY per raggruppare le righe di origine.

Come posso ovviare a questo?

Voglio essere in modo incrementale, in grado di caricare i dati, e non troncare i carichi, ma allo stesso tempo avere una stored proc che gli aggiornamenti o inserti o non si cura se la riga esiste già.

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

Migliore risposta

1

Sembra avere le righe duplicate nella vostra tabella di destinazione che vengono caricati dal tuo precedente viene eseguito.

Nota: Corrispondente a una fusione non considerare le righe inserite (anche doppio) durante l'esecuzione dell'Unione stessa.

Qui di seguito la mia repro esempio con un campione di dati:

Tabella 1: dati Iniziali

enter image description here

Tabella2: Taget tabella

enter image description here

Istruzione Merge:

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;

Quando l'Unione viene eseguita, inserisce tutti i dati senza errori.

enter image description here

Nuovi dati in tb1:

enter image description here

Quando si esegue l'istruzione Merge, mi dà lo stesso errore, come il tuo.

enter image description here

Come soluzione alternativa utilizzando una delle opzioni di seguito,

  1. Aggiungere altre condizioni , se possibile, con la clausola per identificare in modo univoco i dati.

  2. Rimuovere i duplicati dalla sorgente e unire i dati in tb2 come di seguito.

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

Dati fuse in tb2 con successo.

enter image description here

2021-12-02 12:52:40

In altre lingue

Questa pagina è in altre lingue

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