sql >> Base de Datos >  >> RDS >> Sqlserver

Cómo usar ACTUALIZAR desde SELECCIONAR en SQL Server

En este artículo, cubriremos los diferentes métodos para usar la instrucción UPDATE from SELECT en SQL Server.

En el mundo de las bases de datos, los datos estáticos normalmente no se almacenan. En cambio, sigue cambiando cuando actualizamos los datos existentes, archivamos o eliminamos datos irrelevantes y más. Por ejemplo, supongamos que tiene una tabla que almacena datos de precios de productos para su portal de compras. Los precios de los productos cambian constantemente, ya que puede ofrecer descuentos de productos en diferentes momentos a sus clientes. En este caso, no puede agregar nuevas filas en la tabla porque el registro del producto ya existe, pero debe actualizar los precios actuales de los productos existentes.

Aquí es donde entra en juego la consulta ACTUALIZAR. La consulta UPDATE modifica datos en una fila existente en la base de datos. Puede actualizar todas las filas de la tabla o limitar las filas afectadas para la actualización mediante la cláusula WHERE. Por lo general, las actualizaciones de SQL se realizan para una tabla existente con referencia directa. Por ejemplo, en una tabla [empleado], un requisito tiene que incrementar el salario de todos los empleados activos en un 10 %. En este caso, la consulta SQL de referencia directa será:

Actualizar conjunto de empleados [salario]=salario + (salario * 10/100) donde [activo]=1

Suponga que tiene otra tabla [Dirección] que almacena las ubicaciones de los empleados y debe actualizar la tabla [Empleado] según los datos disponibles en la tabla [Dirección]. ¿Cómo se actualizan los datos en la tabla [Empleado]?

Afortunadamente, hay una solución:ACTUALIZAR desde la instrucción SELECT. En la siguiente sección, analizamos diferentes formas de realizar actualizaciones mediante una instrucción SELECT. Por ejemplo, la tabla [Empleado] tiene valores NULL para las columnas:[Código postal] y [Ciudad] en la siguiente captura de pantalla. La tabla [Dirección] tiene valores para ambas columnas [Código postal] y [Ciudad].

Método 1:ACTUALIZAR desde SELECCIONAR:Método de unión

Este método utiliza uniones SQL para hacer referencia a la tabla secundaria que contiene valores que deben actualizarse. Por lo tanto, la tabla de destino se actualiza con los datos de las columnas de referencia para las condiciones especificadas.

Es bastante sencillo usar la instrucción UPDATE from SELECT en este caso. Primero puede usar la instrucción SELECT para obtener la columna de referencia y los valores de la columna de destino.

SELECT e.City,A.City, e.PostCode,A.PostCode
FROM Employee e
INNER JOIN
[Address] a
ON e.EmpID = A.EmpID

A continuación, realizará pequeños cambios en su consulta y preparará una declaración de ACTUALIZACIÓN como se muestra a continuación.

  1. Reemplace la palabra clave seleccionada con actualizar.
  2. Especifique el nombre de la tabla o el alias que debe actualizarse.
  3. Utilice una palabra clave establecida y el símbolo igual (=) entre las columnas de referencia y de destino.
UPDATE e set
e.City=A.City,
e.PostCode=A.PostCode
FROM Employee e
INNER JOIN [Address] a
ON e.EmpID = A.EmpID

Luego ejecute la instrucción UPDATE y verifique que los valores de las columnas de origen y destino sean los mismos.

Método 2:ACTUALIZAR desde SELECT:La sentencia MERGE

La declaración MERGE es útil para manipular datos en la tabla de destino en función de los datos de la tabla de origen para filas coincidentes y no coincidentes. Es un método alternativo para realizar la ACTUALIZACIÓN desde la función de instrucción SELECT.

En el siguiente ejemplo de instrucción MERGE, se realizan las siguientes tareas:

  • Utilice una instrucción MERGE para actualizar los datos en la tabla [Empleado].
  • Luego hace referencia a otra tabla cuando se aplica la cláusula USING.
  • CUANDO COINCIDE luego especifica la fusión JOIN (Inner Join) entre la tabla de origen y la de destino.
  • Luego actualiza el [Código postal] y la [Ciudad] de la tabla [Dirección] a la tabla [Empleado] usando la declaración THEN UPDATE seguida de asignaciones de columnas de origen y destino.
  • La declaración MERGE siempre termina con un punto y coma (;).
MERGE Employee AS e
USING(SELECT * FROM [Address]) AS A
ON A.EmpID=e.EmpID
WHEN MATCHED THEN UPDATE SET
e.PostCode=A.PostCode ,
e.City = A.City;

Método 3:ACTUALIZAR desde SELECCIONAR:Método de subconsulta

La subconsulta define una consulta interna que se puede usar dentro de una declaración SELECT, INSERT, UPDATE y DELETE. Es un método sencillo para actualizar los datos de una tabla existente desde otras tablas.

UPDATE Employee
SET Employee.City=(SELECT [Address].city
FROM [Address]
WHERE [Address].EmpID = Employee.EmpId)
  • La consulta anterior utiliza una instrucción SELECT en la cláusula SET de la instrucción UPDATE.
  • Si la subconsulta encuentra una fila coincidente, la consulta de actualización actualiza los registros del empleado específico.
  • Si la subconsulta devuelve NULL (sin fila coincidente), actualiza NULL para la columna respectiva.
  • Si la subconsulta devuelve más de una fila coincidente, la instrucción ACTUALIZAR genera un error:"La subconsulta de SQL Server devolvió más de 1 valor. Esto no está permitido cuando la subconsulta usa operadores de comparación (=, !=, <, <=,>,>=).”

Limitaciones de subconsultas

  • La subconsulta con un operador de comparación puede incluir solo un nombre de columna excepto si se usa para el operador IN o EXISTS. Por lo tanto, si necesitamos actualizar varias columnas de datos, necesitamos instrucciones SQL separadas.
  • No puedes usar ntexttextoimagen tipos de datos en la subconsulta.
  • La subconsulta no puede incluir GROUP BY y la cláusula HAVING si la subconsulta contiene un operador de comparación sin modificar. El operador de comparación no modificado no puede usar la palabra clave ANY o ALL.

Comparación de rendimiento entre diferentes instrucciones UPDATE from SELECT

En esta sección, haremos la comparación de rendimiento entre diferentes métodos UPDATE from SELECT. Para hacer esto, comenzaremos ejecutando las consultas SQL juntas, habilitando el plan de ejecución real (Ctrl + M) en SQL Server Management Studio y separándolas usando la declaración Go.

En los planes de ejecución, obtengo los siguientes datos para mi demostración:

  • El método de unión tiene un costo de consulta del 41 % (en relación con el lote general)
  • La instrucción MERGE tiene un costo de consulta del 34 % (en relación con el lote general)
  • El método de subconsulta tiene un costo de consulta del 24 % (en relación con el lote general)

El método JOIN utiliza un costo del 40 % para la ordenación distinta y un costo del 35 % para la actualización del índice agrupado.

La combinación de combinación utiliza una combinación interna para hacer coincidir las filas de datos entre los datos de origen y de destino. También tiene el costo relativo máximo para el operador de clasificación.

La subconsulta es el método más rápido para actualizar los datos de la columna. Utiliza la actualización del índice agrupado y el análisis del índice agrupado como se resalta.

Para obtener más detalles, puede consultar mis artículos anteriores: Plan de ejecución de SQL Server:¿qué es y cómo ayuda con los problemas de rendimiento? y Cómo leer y analizar los planes de ejecución de SQL Server.

Resumen

Puede usar cualquier método especificado en este artículo para realizar UPDATE desde declaraciones SELECT. La subconsulta funciona de manera eficiente, pero tiene sus propias limitaciones, como se destacó anteriormente. El rendimiento general de su base de datos depende de los datos de la tabla, la cantidad de actualizaciones, las relaciones entre tablas, los índices y las estadísticas.