Combinación de datos de varias tablas

Completado

En las operaciones de base de datos, a veces es necesario realizar una operación MERGE de SQL. Esta opción DML le permite sincronizar dos tablas insertando, actualizando o eliminando las filas de una tabla según las diferencias que se encuentren en la otra. La tabla que se va a modificar se conoce como tabla de destino. La tabla que se usa para determinar qué filas se van a modificar se denomina tabla de origen.

MERGE modifica los datos en función de una o varias condiciones:

  • Cuando los datos de origen tienen una fila coincidente en la tabla de destino, se pueden actualizar los datos de la tabla de destino.
  • Cuando los datos de origen no tienen ninguna coincidencia en el destino, se pueden insertar datos en la tabla de destino.
  • Cuando los datos de destino no tienen ninguna coincidencia en el origen, se pueden eliminar los datos de destino.

A continuación, se muestra la sintaxis general de una instrucción MERGE. Estamos haciendo coincidir el destino y el origen en una columna especificada y, si hay alguna coincidencia entre el destino y el origen, se especifica una acción que se debe realizar en la tabla de destino. Si no hay ninguna coincidencia, se especifica una acción. La acción puede ser una operación INSERT, UPDATE o DELETE. Este código indica que se aplica una instrucción UPDATE cuando existe alguna coincidencia entre el origen y el destino. Se realiza una operación INSERT cuando hay datos en el origen que no coinciden con los datos del destino. Por último, se realiza una operación DELETE cuando hay datos en el destino sin coincidencia en el origen. Hay muchas otras formas posibles de aplicar una instrucción MERGE.

MERGE INTO schema_name.table_name AS TargetTbl
USING (SELECT <select_list>) AS SourceTbl
ON (TargetTbl.col1 = SourceTbl.col1)
WHEN MATCHED THEN 
   UPDATE SET TargetTbl.col2 = SourceTbl.col2
WHEN NOT MATCHED [BY TARGET] THEN
   INSERT (<column_list>)
   VALUES (<value_list>)
WHEN NOT MATCHED BY SOURCE THEN
   DELETE;

Solo puede usar los elementos de la instrucción MERGE que necesite. Por ejemplo, supongamos que la base de datos incluye una tabla de actualizaciones de facturas por etapas, que incluye una combinación de revisiones de las facturas existentes y las nuevas. Puede usar las cláusulas WHEN MATCHED y WHEN NOT MATCHED para actualizar o insertar datos de factura según sea necesario.

MERGE INTO Sales.Invoice as i
USING Sales.InvoiceStaging as s
ON i.SalesOrderID = s.SalesOrderID
WHEN MATCHED THEN
    UPDATE SET i.CustomerID = s.CustomerID,
                i.OrderDate = GETDATE(),
                i.PurchaseOrderNumber = s.PurchaseOrderNumber,
                i.TotalDue = s.TotalDue
WHEN NOT MATCHED THEN
    INSERT (SalesOrderID, CustomerID, OrderDate, PurchaseOrderNumber, TotalDue)
    VALUES (s.SalesOrderID, s.CustomerID, s.OrderDate, s.PurchaseOrderNumber, s.TotalDue);