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

Cómo ACTUALIZAR desde SELECT en SQL Server

En la mayoría de las circunstancias, las actualizaciones de SQL se realizan mediante referencias directas a una tabla en particular (UPDATE books SET books.title = 'The Hobbit' WHERE books.id = 1 ). Sin embargo, en ocasiones, puede resultar beneficioso alterar el contenido de una tabla indirectamente , mediante el uso de un subconjunto de datos obtenidos de la instrucción de consulta secundaria.

Realizando una UPDATE usando un SELECT secundario La declaración se puede lograr de una de dos maneras, principalmente según la versión de SQL Server que esté utilizando. Exploraremos brevemente ambas opciones para que pueda encontrar la que mejor se adapte a sus necesidades.

Usando INNER JOINS

Para todas las instalaciones de SQL Server, el método más básico para realizar esta acción es usar un INNER JOIN , mediante el cual los valores en las columnas de dos tablas diferentes se comparan entre sí.

UPDATE
  books
SET
  books.primary_author = authors.name
FROM
  books
INNER JOIN
  authors
ON
  books.author_id = authors.id
WHERE
  books.title = 'The Hobbit'

En el ejemplo anterior, estamos UPDATING el books.primary_author campo para que coincida con authors.name para 'El Hobbit' por JOINING ambas tablas en la consulta a sus respectivos valores coincidentes de authors.id y books.author_id .

Usando MERGE para ACTUALIZAR e INSERTAR simultáneamente

Para SQL Server 2008 y posteriores, Microsoft introdujo el MERGE excepcionalmente útil operación que es similar a la anterior INNER JOIN método, pero MERGE intenta realizar una UPDATE y un INSERT mandar juntos. Esto sincroniza efectivamente las dos tablas en función de la consulta realizada, actualizando e insertando registros según sea necesario para que coincidan.

MERGE INTO
  books
USING
  authors
ON
  books.author_id = authors.id
WHEN MATCHED THEN
  UPDATE SET
    books.primary_author = authors.name
WHEN NOT MATCHED THEN
  INSERT
    (books.author_id, books.primary_author)
  VALUES
    (authors.id, authors.name)

La consulta completa al usar MERGE es ciertamente un poco más complejo que el de un INNER JOIN básico , pero una vez que comprenda cómo funciona la operación, comprenderá rápidamente cuán poderosa puede ser realmente esta capacidad.

Las primeras líneas se explican por sí mismas:

MERGE INTO
  books
USING
  authors
ON
  books.author_id = authors.id

Queremos MERGE INTO (UPDATE /INSERT ) los books tabla usando los authors secundarios tabla, y estamos emparejando los dos basados ​​en el mismo books.author_id = authors.id comparación.

Donde MERGE El comando difiere en la lógica de bifurcación que sigue.

WHEN MATCHED THEN
  UPDATE SET
    books.primary_author = authors.name

Aquí le estamos pidiendo a SQL que realice una acción solo cuando los registros MATCHED – cuando se encuentra un registro existente. En ese caso, realizamos una UPDATE estándar tal como lo hicimos antes, configurando el books.primary_author campo para igualar el authors.name campo.

Finalmente, si la consulta descubre un registro comparativo coincidente que no existe, en su lugar realizamos un INSERT .

WHEN NOT MATCHED THEN
  INSERT
    (books.author_id, books.primary_author)
  VALUES
    (authors.id, authors.name)

Aquí simplemente le estamos pidiendo a SQL que INSERT un nuevo registro en los books tabla y pasando los valores para el author_id y primary_author campos, tomados de los authors asociados registro de tabla.

El resultado final de nuestro MERGE afirmación es que para cada autor en los authors table, verificamos si existe un libro correspondiente en books . Si se encuentra un registro, nos aseguramos de que books.primary_author se configura usando UPDATE , y donde no se encuentra ninguna coincidencia, agregamos un nuevo registro a books .

Con eso, debe tener una comprensión sólida de dos métodos diferentes que se pueden usar para UPDATE registros en SQL usando SELECT secundario y comparativo declaraciones.