Hace unos días se me presentó la situación en la que tenía que realizar un merge con datos que no estaban en una tabla, tras realizar una búsqueda por internet sólo encontraba el merge normal que selecciona los datos de una tabla y los junta en otra sin embargo eso no era lo que estaba buscando de manera que le consulté a un amigo y él me ayudó, así que hoy les vengo a compartir esta solución.
Vamos a declarar el merge y en el using vamos a indicar que seleccione la información desde dual, en este ejemplo seleccionamos sólo una fila sin embargo podemos concatenar con UNION ALL
MERGE INTO NombreTabla NT
USING (
SELECT 'Carlos' Nombre, 1 IdPais FROM DUAL
) S
ON (NT.IdPais = S.IdPais)
WHEN MATCHED
THEN
UPDATE SET NT.Nombre = S.Nombre
WHEN NOT MATCHED
THEN
INSERT (Nombre, IdPais) VALUES (S.Nombre, S.IdPais);
En el siguiente código podemos observar un ejemplo con dos filas
MERGE INTO NombreTabla NT
USING (
SELECT 'Carlos' Nombre, 1 IdPais FROM DUAL
UNION ALL
SELECT 'María' Nombre, 2 IdPais FROM DUAL
) S
ON (NT.IdPais = S.IdPais)
WHEN MATCHED
THEN
UPDATE SET NT.Nombre = S.Nombre
WHEN NOT MATCHED
THEN
INSERT (Nombre, IdPais) VALUES (S.Nombre, S.IdPais);
Espero que les sea de ayuda 🙂