En las instrucciones update o delete también se pueden hacer joins

Del mismo modo que ante una consulta que requiera datos de varias tablas recurrimos a join para obtener la solución, en una instrucción update o delete también podemos hacerlo. Lo que sigue utiliza la sintaxis propia de MySQL, pero otros SGBD (como SQL Server o PostgreSQL) también permiten hacerlo de forma similar.

Supongamos que disponemos de estas tablas, Articulo, con datos de precio de los artículos de una BD y Proveedor, con los proveedores que suministran los artículos:

Articulo
+----+--------+------+
| id | precio | id_p |
+----+--------+------+
|  1 |     10 |    1 |
|  2 |     25 |    2 |
|  3 |     50 |    2 |
+----+--------+------+
Proveedor
+------+--------+------------+
| id_p | nombre | incremento |
+------+--------+------------+
|    1 | Abc    |         10 |
|    2 | Xyz    |          5 |
+------+--------+------------+

Queremos incrementar el precio de los artículos que suministra el proveedor ABC, con el incremento indicado en la propia tabla Proveedor. Para ello podemos ejecutar la siguiente instrucción:

BIEN
update Articulo
set precio = precio * (select 1+incremento/100
              from Proveedor
              where nombre = 'ABC')
where id_p = (select id_p
              from Proveedor
              where nombre = 'ABC');

Otra forma de hacerlo es utilizar un join para que los datos de las dos tablas estén disponibles para la instrucción. Veámoslo:

BIEN
update Articulo A join Proveedor P on A.id_p = P.id_p
set precio = precio * (1+incremento/100)
where nombre = 'ABC';

No hay comentarios:

Publicar un comentario