Mesclar dados com base em várias tabelas

Concluído

Em operações de banco de dados, às vezes há a necessidade de executar uma operação SQL MERGE. Esta opção DML permite sincronizar duas tabelas inserindo, atualizando ou excluindo linhas em uma tabela com base nas diferenças encontradas na outra tabela. A tabela que está sendo modificada é chamada de tabela de destino . A tabela usada para determinar quais linhas devem ser alteradas é chamada de tabela de origem .

MERGE modifica dados, com base em uma ou mais condições:

  • Quando os dados de origem têm uma linha correspondente na tabela de destino, eles podem atualizar os dados na tabela de destino.
  • Quando os dados de origem não têm correspondência no destino, eles podem inserir dados na tabela de destino.
  • Quando os dados de destino não têm correspondência na origem, eles podem excluir os dados de destino.

A sintaxe geral de uma instrução MERGE é mostrada abaixo. Estamos combinando o destino e a origem em uma coluna especificada e, se houver uma correspondência entre destino e origem, especificamos uma ação a ser executada na tabela de destino. Se não houver uma correspondência, especificamos uma ação. A ação pode ser uma operação INSERT, UPDATE ou DELETE. Esse código indica que uma ATUALIZAÇÃO é executada quando há uma correspondência entre a origem e o destino. Um INSERT é executado quando há dados na origem sem dados correspondentes no destino. Finalmente, um DELETE é executado quando há dados no destino sem correspondência na origem. Existem muitas outras formas possíveis de uma instrução 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;

Você pode usar apenas os elementos da instrução MERGE necessários. Por exemplo, suponha que o banco de dados inclua uma tabela de atualizações de faturas em estágios, que inclua uma combinação de revisões de faturas existentes e novas faturas. Você pode usar as cláusulas WHEN MATCHED e WHEN NOT MATCHED para atualizar ou inserir dados da fatura conforme necessário.

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