DACĂ EXISTĂ și FUZIONA Declarație

0

Problema

Am date care curge într-o singură masă de la mai multe alte tabele vă permite să spun: Table_A Atunci am o Îmbinare stocate proc care ia datele din tabelul O fuzionează cu Tabelul B.

Cu toate acestea, ceva nu pare a fi de dreapta. Dacă nu trunchia și încărcați de date funcționează bine, dar dacă nu trunchia și de sarcină, și doar aduce interogare prin eachh ore primesc mesaj de eroare spunând

Msg 8672, Nivel 16, Stat 1, Procedura Merge_Table_A, Linia 4 [Lot Linia De Start 0] UNIFICARE declarație a încercat să ACTUALIZEZE sau să șteargă acelasi rand de mai multe ori. Acest lucru se întâmplă atunci când o țintă rând meciuri mai mult decât o sursă de rând. O ÎMBINARE declarație nu poate UPDATE/DELETE același rând din tabel țintă de mai multe ori. Rafina PE clauză pentru a se asigura o țintă rând potrivește cel mult o sursă de rând, sau de a folosi clauza GROUP BY pentru a grupa sursă rânduri.

Cum pot trece peste asta?

Vreau să fie în măsură să incremental de încărcare a datelor și nu trunchia sarcini, dar în același timp au un stocate proc că, actualizări sau de a introduce sau nu-i pasă dacă rândul există deja.

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

Cel mai bun răspuns

1

Se pare ca ai duplicat rânduri în tabel țintă care sunt încărcate de la cursele anterioare.

Notă: de Potrivire într-o Îmbinare nu ia în considerare rânduri inserate (chiar duplicat) în timp ce rulează Îmbina în sine.

Mai jos este mi repro exemplu, cu un eșantion de date:

Tabelul 1: date Inițiale

enter image description here

Tabelul 2: Target masa

enter image description here

Merge Declarație:

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;

Atunci când Îmbinarea este executat, acesta introduce toate datele fără erori.

enter image description here

Date noi în tb1:

enter image description here

Când am rula instrucțiune Merge, imi da aceeasi eroare ca a ta.

enter image description here

Ca o soluție , folosind una dintre opțiunile de mai jos,

  1. Adaugă condiții suplimentare , dacă este posibil, în clauza de a identifica în mod unic datele.

  2. Elimina duplicatele de la sursă și să îmbinați datele în tb2 de mai jos.

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

Datele au fuzionat într-tb2 cu succes.

enter image description here

2021-12-02 12:52:40

În alte limbi

Această pagină este în alte limbi

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