PostgreSQL 教程: UPDATE JOIN 连接更新

九月 6, 2023

摘要:在本教程中,您将学习如何使用 PostgreSQL 的UPDATE连接语法,根据另一个表中的值更新表中的数据。

PostgreSQL UPDATE 连接语法简介

有时,您需要根据另一个表中的值更新表中的数据。在这种情况下,您可以使用 PostgreSQL 的UPDATE连接语法,如下所示:

UPDATE t1
SET t1.c1 = new_value
FROM t2
WHERE t1.c2 = t2.c2;

要在UPDATE语句中连接到另一个表,您可以在FROM子句中指定连接的表并在WHERE子句中提供连接条件。FROM子句必须紧接在SET子句之后出现。

对于表t1的每一行,UPDATE语句检查表t2的每一行。如果表t1c2列中的值等于表t2c2列中的值,则UPDATE语句将表t1c1列中的值更新为新值 (new_value)。

PostgreSQL UPDATE JOIN 示例

让我们看一个示例来了解 PostgreSQL 的UPDATE连接的工作原理。我们将使用以下数据库表进行演示:

PostgreSQL UPDATE join sample database

首先,创建一个新表,名为product_segment,用于存储包括超豪华、豪华和大众在内的产品细分。

product_segment表有一个discount列存储基于特定细分市场的折扣百分比。例如,超豪华细分市场的产品有5%折扣,而豪华和大众产品则分别有6%10%折扣。

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);

其次,创建另一个名为product的表来存储产品数据。product表具有链接到segment表的id列的外键列 segment_id

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);

第三步,假设您必须根据产品细分市场的折扣来计算每种产品的净价。为此,您可以应用UPDATE join 语句,如下所示:

UPDATE product
SET net_price = price - price * discount
FROM product_segment
WHERE product.segment_id = product_segment.id;

您可以利用表别名来简化查询,如下所示:

UPDATE 
    product p
SET 
    net_price = price - price * discount
FROM 
    product_segment s
WHERE 
    p.segment_id = s.id;

该语句将product表与product_segment表连接起来。如果两个表中存在匹配项,则会从product_segment表中获取折扣,根据以下公式计算净价,并更新net_price列。

net_price = price - price * discount;

以下SELECT语句检索product表的数据以验证更新:

SELECT * FROM product;

PostgreSQL UPDATE Join Example

如您所见,net_price列已更新为正确的值。

在本教程中,您学习了如何使用 PostgreSQL 的UPDATE join 语句,根据另一个表中的值更新表中的数据。