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.