SQL- La sentencia Merge

En muchas ocasiones, cuando se necesita determinar si una fila existe para ejecutar una sentencia de atualizacion(update), o si no existe para ejecutar una sentencia de inserción(insert), generalmente en sql se tenian que lanzar varias consultas por separado

y en plsql un bloque como el siguiente

lo anterior resultando en un bloque de código extenso, en el caso de plsql y sentencias por separado en el caso de sql.

Con la incorporación de la consulta merge, es posible ejecutar operaciones de actualizacion o inserción definiendo una sola sentencia sql, en la cual se especifican determinados condicionales.

La siguiente es la estructura de la sentencia merge:

MERGE INTO tabla
USING (una_tabla, una_vista o una vista en linea)
ON (condicion de union)
WHEN MATCHED THEN
UPDATE SET
columnaA = valorA,
columnaB = valorB,

WHEN NOT MATCHED THEN
INSERT (columnas)
VALUES (valores)

Ejemplo:

Se tienen dos tablas “alumno” e “inscripcion” con los siguiente campos respectivamente

Alumno(id_alumno, nombres, apellidos, …)

Inscripción (id_alumno, id_materia, calificación, indicativo_aprobada)

Se desea actualizar las calificaciones existentes con calificación = 4.3 y marcarlas como aprobadas, pero en el caso en que no existan se deben adicionar a la tabla inscripción con calificación = 4 y marcarlas igualmente como aprobadas.

La sentencia para el anterior caso sería:

MERGE INTO inscripcion i
USING alumno a
ON (i.id_alumno = a.id)
WHEN MATCHED THEN
UPDATE SET
calificacion = 4.3,
indicativo_aprobado = ‘S’
WHEN NOT MATCHED THEN
INSERT (id_alumno, id_materia, calificacion, indicativo_aprobado)
VALUES (a.id, 1, 4.0, ‘S’);

En la consulta anterior, si no existe en la tabla “inscripción” un registro con id_alumo = id en la tabla alumno, se insertan los valores que aparecen en la clausula WHEN NOT MATCHED THEN. Pero si existen registros coincidentes, se actualizan con los valores especificados en la clausula WHEN MATCHED THEN

ver log de sql

Para finalizar, puede verse que usando esta sentencia es muy sencillo condicionar la actualización o inserción de filas usando pocas líneas y en una sola sentencia.

Escrito por: Arturo T

atocarrunchot at gmail dot com

Leave a Reply