MERGE é um comando DML (Data Manipulation Language), assim como INSERT, DELETE e UPDATE. Apesar de não ser tão conhecido e usado quanto os outros DML’s, o MERGE merece uma atenção especial por ser um comando muito útil em vários tipos de casos, como sincronização de dados entre diferentes tabelas, carga de dados em processos ETL, entre outros.

 

Vamos para a parte prática, pois acredito que esta seja a maneira mais fácil de entender esta funcionalidade e de aprender como funciona.

Primeiro vou conectar ao schema HR e criar uma tabela para fazer os testes.

Criei uma tabela chamada “moto2”, com a mesma estrutura da tabela “moto”, que é uma tabela muito simples, conforme podem conferir abaixo:

Agora vamos aos comandos MERGE!

O que fez o comando acima? Vamos para a “tradução”!

O comando MERGE foi aplicado na tabela “moto2“, usando como base a tabela “moto“. A chave de comparação entre as duas tabelas foi o campo “moto_id“, que é a chave primária das duas tabelas. Isso foi definido nas cláusulas USING e ON, respectivamente.

A cláusula WHEN MATCHED THEN disse o seguinte: “sempre que encontrar um registro na tabela moto em que a chave primária já exista na tabela moto2, atualize o campo dono da tabela moto2 com o valor do campo dono da tabela moto.”

A cláusula WHEN NOT MATCHED THEN disse o seguinte: “se um registro da tabela moto não foi encontrado na tabela moto2, tomando como base o campo moto_id, então insira o registro correspondente na tabela moto2“.

O exemplo acima foi bem simples. Após o comando, a tabela moto2, que antes estava vazia, ficou idêntica a tabela moto:

Você pode estar se perguntando: fiz esse comando enorme apenas para deixar as tabelas iguais? Calma! Como a tabela moto2 estava vazia, sim, ele fez isso. Usando o mesmo comando MERGE novamente, ele fará as alterações de forma incremental. Vamos pra mais um exemplo, na sequência do que fizemos acima:

Alteramos a tabela moto, agora vamos consultar os dados das 2 tabelas, para ver as diferenças:

A diferença das duas tabelas são apenas 2 registros: o de moto_id = 6, onde o campo “dono” está diferente, e o moto_id = 8, que não existe na tabela moto2. Agora vamos rodar o MERGE novamente:

O comando MERGE atualizou os dados da tabela moto2 conforme o especificado, ou seja, o registro que não existia foi inserido. E o registro que estava diferente foi alterado. Importante ver que o comando só especificou UPDATE no campo dono, portanto, se eu alterar o campo moto_nome na tabela moto, essa alteração não será refletida na tabela moto2 com o comando MERGE.

Outra cláusula que pode ser usada é a DELETE. Vamos preparar o caso para testar essa cláusula:

Conferindo novamente os dados das duas tabelas:

E finalmente o comando MERGE usando a cláusula DELETE:

O MERGE atualizou o registro 5, atualizando o campo dono para o valor 103, e também apagou os registros 8 e 9, obedecendo a condição especificada (dono = 102).