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.