Sentencia MERGE Sql Server 2008
Investigando sobre las nuevas características que trae el Sql Server 2008 me encontré con una nueva sentencia muy útil para las etapas de warehousing.
Esta sentencia se llama MERGE, y como su nombre lo dice combina un origen de datos con un destino de datos, que en una situación típica de warehousing corresponderían por ejemplo a la tabla actual de Reclamos del mes recién cerrado y la tabla maestro de Reclamos del warehouse.
– Preparamos datos de ejemplo
DECLARE @Reclamos TABLE (Rut INT, Reclamos INT, Activo char(1))
INSERT @Reclamos
SELECT 1, 1, ‘S’
UNION ALL
SELECT 2, 1, ‘S’
DECLARE @NewReclamos TABLE (Rut INT, Reclamos INT, Activo char(1))
INSERT @NewReclamos
SELECT 1, 0, ‘N’
UNION ALL
SELECT 2, 1, ‘S’
UNION ALL
SELECT 2, 1, ‘S’
UNION ALL
SELECT 3, 1, ‘S’
SELECT * FROM @Reclamos
SELECT * FROM @NewReclamos
@Reclamos @NewReclamos
| Rut | Reclamos | Activo | Rut | Reclamos | Activo | |
| 1 | 1 | S | 1 | 0 | N | |
| 2 | 1 | S | 2 | 1 | S | |
| 2 | 1 | S | ||||
| 3 | 1 | S |
– Ejecutamos Merge
MERGE @Reclamos AS r
USING ( SELECT Rut, SUM(Reclamos) Reclamos, MAX(Activo) Activo
FROM @NewReclamos
GROUP BY Rut) AS src ON src.Rut = r.Rut
WHEN MATCHED AND src.Activo = ‘N’
THEN DELETE
WHEN MATCHED
THEN UPDATE SET r.Reclamos = r.Reclamos + src.Reclamos
WHEN NOT MATCHED THEN
INSERT (Rut, Reclamos, Activo)
VALUES (src.Rut, src.Reclamos, src.Activo);
SELECT * FROM @Reclamos
| Rut | Reclamos | Activo |
| 2 | 3 | S |
| 3 | 1 | S |
En el ejemplo tenemos una tabla maestro de reclamos que tiene valores para los Rut 1 y 2. Sin embargo en la nueva tabla de reclamos recibida notamos tres cosas:
· El Rut 1 ya no es cliente activo.
· El Rut 2 ha puesto dos nuevos reclamos.
· El Rut 3 ha puesto un reclamo sin tener historial de reclamos.
Lo que hará el comando MERGE será en el primer caso eliminar el registro de la tabla de reclamos, pues el cliente ya no es activo (esto puede ser polémico, pero sirve para el ejemplo).
En el segundo caso actualizara la variable reclamos de manera de agregar los dos nuevos reclamos al reclamo que ya tenía quedando con 3 reclamos.
En el tercer caso insertara al cliente en la maestro de reclamos, pues no existía.
Si bien todo esto era perfectamente posible de implementar en SQL Server 2005, requería de una gran cantidad de código para realizar todas las validaciones necesarias para ejecutar el comando sin errores. Tener una expresión más compacta puede ayudar a tener procesos de ETL mucho más limpios, rápido y con menor probabilidad de errores.
Patricio Cofre Torres