Mesclar dados com base em várias tabelas

Concluído

Em operações de banco de dados, às vezes é necessário executar uma operação de MESCLAGEM SQL. Essa opção DML permite que você sincronize duas tabelas, através da inserção, atualização ou exclusão de 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 que linhas alterar é chamada tabela de origem.

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

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

A sintaxe geral de uma instrução MERGE é mostrada abaixo. Estamos correspondendo o destino e a origem em uma coluna especificada e, se houver uma correspondência entre o destino e a origem, especificamos uma ação a ser tomada 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 operação UPDATE é 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. Por fim, um DELETE é executado quando há dados no destino sem nenhuma correspondência na origem. Há muitas outras formas possíveis de instruções 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 de que precisa. Por exemplo, suponha que o banco de dados inclua uma tabela de atualizações de fatura em fases, que inclua uma combinação de revisões para 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);