SI EXISTE y la Instrucción MERGE

0

Pregunta

Tengo el flujo de datos en una tabla de varias otras tablas que permite decir: Table_A Entonces tengo una Combinación de procedimientos almacenados que toma los datos de la tabla a se combina con la Tabla B.

Sin embargo, algo no parece estar bien. Si me truncar y la carga de los datos que funciona bien, pero si no me truncate y de carga, y sólo captura la consulta por eachh hora me sale el mensaje de error que dice

Msg 8672, Nivel 16, Estado 1, Procedimiento Merge_Table_A, Línea 4 [Inicio De Proceso Por Lotes De La Línea 0] La instrucción MERGE intentado ACTUALIZAR o ELIMINAR la misma fila más de una vez. Esto sucede cuando una fila de destino coincide con más de una fila de origen. Una COMBINACIÓN de la declaración no puede ACTUALIZAR/ELIMINAR de la misma fila de la tabla de destino varias veces. Refinar la cláusula ON para garantizar una fila de destino coincide con al menos una fila de origen, o el uso de la cláusula GROUP BY para agrupar las filas de origen.

¿Cómo puedo superar esto?

Quiero ser capaz de incrementalmente la carga de los datos y no truncar las cargas, pero al mismo tiempo, tienen un procedimiento almacenado que las modificaciones o inserciones o no importa si la fila a la que ya existe.

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

Mejor respuesta

1

Parece que han filas duplicadas en la tabla de destino que se cargan de sus carreras anteriores.

Nota: la Coincidencia en una Combinación de no considerar las filas insertadas (incluso duplicar) durante la ejecución de la Mezcla en sí misma.

A continuación es mi repro ejemplo con una muestra de datos:

Tabla1: datos Iniciales

enter image description here

Tabla2: Taget tabla

enter image description here

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;

Cuando la Mezcla se ejecuta, se inserta todos los datos sin errores.

enter image description here

Nuevos datos en tb1:

enter image description here

Cuando ejecuto la instrucción Merge, me da el mismo error como el tuyo.

enter image description here

Como una solución utilizando una de las siguientes opciones,

  1. Añadir condiciones adicionales , si es posible en la cláusula ON para identificar los datos.

  2. Quitar los duplicados de la fuente y combinar los datos en tb2 como a continuación.

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

Los datos se fusionaron en tb2 con éxito.

enter image description here

2021-12-02 12:52:40

En otros idiomas

Esta página está en otros idiomas

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