Comando MERGE: Uma abordagem PRÁTICA
O comando MERGE é uma instrução SQL que permite combinar dados de duas ou mais tabelas em uma única operação. Ele pode ser usado para inserir, atualizar ou excluir registros de uma tabela alvo, dependendo de uma condição de correspondência com uma tabela fonte. O comando MERGE tem a seguinte sintaxe:
MERGE INTO tabela_alvo [alias1]
USING tabela_fonte [alias2]
ON (condição_de_correspondência)
WHEN MATCHED THEN
UPDATE SET coluna1 = valor1 [, coluna2 = valor2 ...]
WHERE condição_de_atualização
DELETE WHERE condição_de_exclusão
WHEN NOT MATCHED THEN
INSERT (coluna1 [, coluna2 ...]) VALUES (valor1 [, valor2 ...])
WHERE condição_de_inserção;
A cláusula MERGE INTO
especifica a tabela alvo que será modificada. A cláusula USING
especifica a tabela fonte que fornece os dados para a operação. A cláusula ON
especifica a condição de correspondência entre as duas tabelas, que deve resultar em um valor verdadeiro ou falso. A cláusula WHEN MATCHED THEN
especifica as ações a serem executadas quando há uma correspondência entre as tabelas, que podem ser atualizar ou excluir registros da tabela alvo. A cláusula WHEN NOT MATCHED THEN
especifica a ação a ser executada quando não há uma correspondência entre as tabelas, que é inserir registros na tabela alvo.
Para ilustrar o uso do comando MERGE, vamos usar os esquemas de amostra HR e OE do Oracle Database. Suponha que queremos sincronizar os dados dos funcionários entre as duas tabelas EMPLOYEES, uma no esquema HR e outra no esquema OE. Para isso, podemos usar o seguinte comando MERGE:
MERGE INTO oe.employees e
USING hr.employees h
ON (e.employee_id = h.employee_id)
WHEN MATCHED THEN
UPDATE SET e.first_name = h.first_name,
e.last_name = h.last_name,
e.email = h.email,
e.phone_number = h.phone_number,
e.hire_date = h.hire_date,
e.job_id = h.job_id,
e.salary = h.salary,
e.commission_pct = h.commission_pct,
e.manager_id = h.manager_id,
e.department_id = h.department_id
WHERE e.last_name <> h.last_name OR
e.email <> h.email OR
e.phone_number <> h.phone_number OR
e.hire_date <> h.hire_date OR
e.job_id <> h.job_id OR
e.salary <> h.salary OR
e.commission_pct <> h.commission_pct OR
e.manager_id <> h.manager_id OR
e.department_id <> h.department_id
DELETE WHERE h.end_date IS NOT NULL
WHEN NOT MATCHED THEN
INSERT (e.employee_id, e.first_name, e.last_name, e.email,
e.phone_number, e.hire_date, e.job_id, e.salary,
e.commission_pct, e.manager_id, e.department_id)
VALUES (h.employee_id, h.first_name, h.last_name, h.email,
h.phone_number, h.hire_date, h.job_id, h.salary,
h.commission_pct, h.manager_id, h.department_id)
WHERE h.end_date IS NULL;
Esse comando irá atualizar os registros da tabela OE.EMPLOYEES com os dados da tabela HR.EMPLOYEES quando os IDs dos funcionários forem iguais, mas algum outro campo for diferente. Ele irá excluir os registros da tabela OE.EMPLOYEES quando os IDs dos funcionários forem iguais, mas o campo END_DATE da tabela HR.EMPLOYEES não for nulo. Ele irá inserir os registros na tabela OE.EMPLOYEES com os dados da tabela HR.EMPLOYEES quando os IDs dos funcionários não forem iguais e o campo END_DATE da tabela HR.EMPLOYEES for nulo.
Espero que este artigo tenha te ajudado a entender melhor o comando MERGE do Oracle SQL.
Abs