Uso del comando MERGE en SQL Server para operaciones complejas
Resumen
¿Qué es el comando Merge en SQL Server?
El comando Merge en SQL Server es una herramienta poderosa que nos permite realizar múltiples operaciones, como insert, delete y update, en una sola instrucción. Este comando es especialmente útil para sincronizar tablas y realizar operaciones complejas, optimizando así nuestro código. Su aplicación se extiende a tareas de auditoría, control de cambios y gestión de histórico de datos.
¿Cómo crear una base de datos para practicar?
Para comenzar a practicar con SQL Server y el comando Merge, primero necesitamos crear una base de datos de pruebas. Aunque el instructor la llama "Platzi", puedes elegir el nombre que desees. Una vez creada la base de datos, es crucial agregar tablas de prueba y algunos datos para manipular. El instructor proporciona un query adjunto para facilitar esta tarea, pero debes tener cuidado de no ejecutar inadvertidamente las últimas dos líneas de delete.
¿Cómo se utiliza el comando Merge en SQL Server?
La sintaxis básica para el comando Merge en SQL Server es la siguiente:
MERGEINTO UsuarioTarget AS Target
USING UsuarioSource AS Source
ON Target.Código = Source.Código
WHENMATCHEDAND Target.Nombre <> Source.Nombre THENUPDATESET Target.Puntos = Source.Puntos
WHENNOTMATCHEDBY TARGET THENINSERT(Nombre, Puntos)VALUES(Source.Nombre, Source.Puntos)WHENNOTMATCHEDBY SOURCE THENDELETE;
Veamos cada paso:
Definición de tablas fuente y destino: En el ejemplo anterior, UsuarioTarget es nuestra tabla de destino, mientras que UsuarioSource es la tabla fuente. Se les asignan alias (Target y Source) para simplificar el código.
Condiciones de coincidencia: Utilizamos la cláusula ON para definir las columnas que se compararán entre las tablas, en este caso Código.
Condiciones WHEN MATCHED: Aquí se especifica que, si el Código coincide pero los nombres no, se realizará un UPDATE.
Condiciones WHEN NOT MATCHED BY TARGET: En este escenario, se realiza un INSERT si un registro está en Source pero no en Target.
Condiciones WHEN NOT MATCHED BY SOURCE: Se ejecuta un DELETE si un registro está en Target pero no en Source.
¿Por qué utilizar Output en el Merge?
El uso del comando OUTPUT en MERGE nos permite monitorear qué acciones se han realizado durante la ejecución de la operación. Nos muestra, en una tabla, los insert, delete o update que se llevaron a cabo, lo que es muy útil para:
Auditoría: Llevar un seguimiento de las acciones realizadas.
Control de cambios: Observar qué registros fueron modificados o eliminados.
Historial de datos: Crear una bitácora que registre las alteraciones de datos.
Esto nos brinda un control exhaustivo sobre nuestras bases de datos y facilita la depuración y optimización de nuestro código SQL.
Ventajas prácticas del Merge
El comando Merge no solo permite combinar múltiples operaciones, sino que también mejora el rendimiento y simplifica la escritura de código SQL. Al practicar y experimentar con Merge, se volverá una herramienta indispensable, especialmente en entornos donde se requiere la manipulación frecuente de grandes conjuntos de datos. Te animamos a seguir explorando y experimentando con Merge para aprovechar al máximo sus capacidades en tus proyectos SQL.
MERGE: Ejecuta operaciones de inserción, actualización o eliminación en una tabla de destino a partir de los resultados de una combinación con una tabla de origen. Por ejemplo, sincronice dos tablas mediante la inserción, actualización o eliminación de las filas de una tabla según las diferencias que se encuentren en la otra.
MERGE: Permite en una sola instrucción realizar una o varias operaciones (INSERT, UPDATE, DELETE).
Sugerencia: En los archivos adjuntos todos se llaman SQL_Optimizacion.sql pero quizas podriamos nombrarlos con el tema a tratar, para que el estudiante al descargarlo sepa a que clase pertenece cada archivo adjunto.
EL video 12 y el el video 11 estan intercambiados, el 12 deberia ir primero y el 11 debe ser el 12
Un comando muy potente.
<strong>Sugerencia de rendimiento:</strong> el comportamiento condicional descrito para la instrucción MERGE funciona mejor cuando las dos tablas tienen una mezcla compleja de características coincidentes. Por ejemplo, insertar una fila si no existe o actualizar una fila si coincide. Cuando simplemente se actualiza una tabla basada en las filas de otra tabla, mejore el rendimiento y la escalabilidad con las instrucciones básicas INSERT, UPDATE y DELETE.
Wow que buena utlidad. Bastante sencilla de usar y muy poderosa. Me gusta que es bastante "verbosa", eso hace que la su uso se facilite un montón.
Usar MERGE o LEFT JOIN depende del contexto de la operación.
MERGE es ideal para realizar múltiples operaciones (INSERT, UPDATE, DELETE) en una sola instrucción, lo que facilita la sincronización de tablas. Esto te permite actualizar y agregar filas en una sola operación, lo que puede ser más eficiente en términos de rendimiento.
Un LEFT JOIN que filtre solo los datos con valores diferentes puede ser útil para obtener resultados específicos sin modificar las tablas originales. Sin embargo, generalmente requiere más pasos, ya que deberías definir explícitamente cómo manejar los resultados (actualizaciones, inserciones, eliminaciones).
En resumen, si necesitas hacer cambios en las tablas, MERGE es más apropiado. Si solo deseas obtener una comparación, el LEFT JOIN sería suficiente.
¿Desde que versión de SQL se puede hacer uso de MERGE?
Hola, te funciona desde SQL Server 2008
¿Qué es Merge y cómo se usa?
Esta instrucción permite sincronizar dos tablas, basadas en una condición de coincidencia.
Estas dos tablas se denominan target y source .
Tabla target: Es la tabla que se va a actualizar, en esta tabla se ejecutan las operaciones de inserción, actualización o eliminación de registros, dependiendo la relación de coincidencia.
Tabla source: Es la tabla de referencia que proporciona los datos para actualizar la tabla target, esta tabla no se modifica en el proceso.
Lógica de MERGE:
WHEN MATCHED: Si los registros coinciden entre ambas tablas (según la clave especificada), los datos de target se actualizan con los de source.
WHEN NOT MATCHED BY TARGET: Si los registros que tiene source no los tiene target, entonces se insertan en target.
WHEN NOT MATCHED BY SOURCE: Si existen registros en target que no están en source, entonces se eliminan de target.
No conocía éste comando, lástima que no lo conocí antes, se mira que es muy potente, ahora lo utilizaré con frecuencia.
Solo ten mucho cuidado. Si no esta bienla comparacion, puedes echarte informacion no deseada.
¿Parece buena la opción pero que tanto afecta al rendimiento esta transacción ? he intentado agregar indices a las tablas en las que ya tengo un merge pero cuando lo ejecuto, falla y marca error el merge
Cada caso se debe de analizar por rendimiento, pero si te da error debes revisar el mensaje y analiarlo, te debe de indicar que parte del query es el que debe de mejorarse.
MERGE también lo podríamos utilizar para poder sincronizar dos bases de datos distintas? Es decir, que ambas bases tengas tablas similares y poder sincronizar los registros...?
Sí, si tienes las BN en la misma instancia puedes hacer BD1..Tabla1
Sí, si tienes las BD en la misma instancia puedes hacer algo como:
MERGEBD1..ClienteASTARGETUSING(SELECTId,NombreBD2..Cliente)ASSOURCEONTARGET.Id=SOURCE.IdWHENMATCHEDTHENUPDATESETNombre=SOURCE.NAMEWHENNOTMATCHEDTHENINSERT(Nombre)VALUES(SOURCE.NAME);En caso de que estén en instancias aparte puedes usar link server, te dejo un enlace para dicha configuración:https://www.sqlshack.com/es/como-crear-y-configurar-un-servidor-enlazado-en-sql-server-management-studio/
Exactamente tiene que ser igual el script, por que yo trato de invertir lo que dice el profesor un ejemple en vez que elimine la tabla TARGET elimíname datos del SOURCE ? gracias.
No me quedó claro tu consulta, pero en el merge puedes hacer varias combinaciones. Que es lo que quieres hacer?
Importa el Orden Del Merge o el Using en las tablas ?
Me explico obtengo el mismo resultado invirtiendo el orden de las tablas?
Si es importante, debes indicar cual es la fuente y cual la tabla destino
Los nombres no deberían de ser palabras reservadas como **Target **o Source, se considera buena práctica?
no vas a tener problema, igual puedes poner el nombre que gustes
consulta el update ejecuta un delete y un insert al mismo tiempo? o me equivoco, según el output así parece
Es correcto
Hola, Saben de algun Hint para optimizar un query de una tabla que no tiene busqueda por indice?
para eso son los índices, para optimizar las busquedas. Cada caso se deben de analizar de forma independiente, pero si tienes un proceso que utilizar columnas no indexadas, debes de analizar si es necesario crear un índice.
Se puede hacer optimización de la query al momento de usar MERGE en SQL Server?
Siempre está la opcion de optimizar las consultas, aunque en el join del merge seguramente vas a utilizar las columnas primary, tambien puedes agregarle otros filtros y eventualmente agregarle indices para que tengan mejor rendimiento.
Pregunta para el equipo de soporte de platzi:
:
1- En varios cursos me ha pasado:paso por las clases y no las marca en verde , esto me ayuda a saber en qué clase quedé la última vez.
2- En varios cursos no me permite ver clases en el orden que quiera, me lleva a la 1a clase.
por favor su respuesta.
gracias
Hola, ese tipo de cosas a mi me pasa cuando uso la app en android, y tengo que despues pinchar todos los videos ´para que aparezca el avance cuando estoy en el computador
¡Hola! Si quieres que el equipo de Platzi te responda debes escribir a team@platzi.com contándoles tus sugerencias, ellos no suelen responder en preguntas de clases, escríbeles a su correo ^^
Pero el script de OUTPUT solo lo puedo ejecutar una vez luego del MERGE? O lo puedo ejecutar luego nuevamente para volver a ver los resultados?
El script de OUTPUT solo se ejecuta cuando ocurre un INSERT, DELETE, UPDATE O MERGE, no lo puedes ejecutar luego sin antes hacer una de estas DML. Te dejo el link de la documentación: Documentación Microsoft.