Saltar a contenido

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:

PostgreSQL UPDATE join sample database

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;

PostgreSQL UPDATE Join Example

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.