A veces, es necesario actualizar los datos de una tabla basándose en los valores de otra tabla. En este caso, puede utilizar la unión UPDATE
de PostgreSQL.
Esta es la sintaxis básica de la sentencia UPDATE
join:
UPDATE table1
SET table1.c1 = new_value
FROM table2
WHERE table1.c2 = table2.c2;
Para unir una tabla (tabla1) con otra (tabla2) en la sentencia UPDATE
, especifique la tabla unida (tabla2) en la cláusula FROM
y proporcione la condición de unión en la cláusula WHERE
. La cláusula FROM
debe aparecer inmediatamente después de la cláusula SET
.
Para cada fila de la tabla table1
, la sentencia UPDATE
examina cada fila de la tabla table2
.
Si los valores de la columna c2
de la tabla tabla1
son iguales a los valores de la columna c2
de la tabla tabla2
, la sentencia UPDATE
actualiza el valor de la columna c1
de la tabla tabla1
con el nuevo valor(nuevo_valor
).
Ejemplo de UPDATE JOIN¶
Veamos un ejemplo para entender como funciona el UPDATE
join de PostgreSQL. Usaremos las siguientes tablas de base de datos para la demostración:
En primer lugar, cree una nueva tabla llamada segmento_producto
que almacene los segmentos de producto como gran lujo, lujo y masa.
La tabla segmento_producto
tiene una columna de descuento
que almacena el porcentaje de descuento basado en un segmento específico. Por ejemplo, los productos con el segmento de gran lujo tienen un descuento del 5%
, mientras que los productos de lujo y masivos tienen descuentos del 6%
y el 10%
respectivamente.
CREATE TABLE product_segment (
id SERIAL PRIMARY KEY,
segment VARCHAR NOT NULL,
discount NUMERIC (4, 2)
);
INSERT INTO
product_segment (segment, discount)
VALUES
('Grand Luxury', 0.05),
('Luxury', 0.06),
('Mass', 0.1);
En segundo lugar, cree otra tabla llamada product
que almacene los datos de los productos. La tabla product
tiene la columna de clave foránea segment_id
que enlaza con el id
de la tabla segment
.
CREATE TABLE product(
id SERIAL PRIMARY KEY,
name VARCHAR NOT NULL,
price NUMERIC(10,2),
net_price NUMERIC(10,2),
segment_id INT NOT NULL,
FOREIGN KEY(segment_id) REFERENCES product_segment(id)
);
INSERT INTO
product (name, price, segment_id)
VALUES
('diam', 804.89, 1),
('vestibulum aliquet', 228.55, 3),
('lacinia erat', 366.45, 2),
('scelerisque quam turpis', 145.33, 3),
('justo lacinia', 551.77, 2),
('ultrices mattis odio', 261.58, 3),
('hendrerit', 519.62, 2),
('in hac habitasse', 843.31, 1),
('orci eget orci', 254.18, 3),
('pellentesque', 427.78, 2),
('sit amet nunc', 936.29, 1),
('sed vestibulum', 910.34, 1),
('turpis eget', 208.33, 3),
('cursus vestibulum', 985.45, 1),
('orci nullam', 841.26, 1),
('est quam pharetra', 896.38, 1),
('posuere', 575.74, 2),
('ligula', 530.64, 2),
('convallis', 892.43, 1),
('nulla elit ac', 161.71, 3);
En tercer lugar, supongamos que tiene que calcular el precio neto de cada producto basándose en el descuento del segmento de productos. Para ello, puede aplicar la sentencia UPDATE
join del siguiente modo:
UPDATE product
SET net_price = price - price * discount
FROM product_segment
WHERE product.segment_id = product_segment.id;
Puede utilizar los alias de tabla para acortar la consulta de esta forma:
UPDATE
product p
SET
net_price = price - price * discount
FROM
product_segment s
WHERE
p.segment_id = s.id;
Esta sentencia une la tabla producto
con la tabla segmento_producto
. Si hay una coincidencia en ambas tablas, obtiene un descuento de la tabla segmento_producto
, calcula el precio neto basándose en la siguiente fórmula y actualiza la columna precio_neto
.
net_price = price - price * discount;
La siguiente sentencia SELECT
recupera los datos de la tabla de productos
para verificar la actualización:
SELECT * FROM product;
La salida indica que la columna net_price
se ha actualizado con los valores correctos.
Resumen¶
- Utilice la sentencia
UPDATE
join de PostgreSQL para actualizar los datos de una tabla basándose en los valores de otra tabla.