使用通用 Table 表达式更新

Update using Common Table Expression

我在一对多关系中有一对 table。我想在 One table 中插入行,在 Many table 中插入行,然后在 One table.

中更新新行

一个简化的结构如下。在 https://dbfiddle.uk/?rdbms=postgres_12&fiddle=8555fb74372b91c8854f7a18e78110c0

有一个 fiddle

除了最后一步外,一切正常,新行应该被更新。我得到更新值 NULL

我看不出缺少什么才能让它发挥作用。我怀疑它与使用 FROM 子句更新的正确语法有关。根据文档,这就是您可以向 UPDATE 语句提供额外数据的方式。另一方面,可能还有更基本的东西。

我知道我可以写一个函数来做到这一点,而且我已经做到了。在这里我想更好地理解其中涉及的SQL。

CREATE TABLE testsales(
    id int GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
    customerid int,
    total decimal(6,2)
);
CREATE TABLE testitems(
    id int GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
    saleid int REFERENCES testsales(id),
    productid int,
    quantity int,
    price decimal(5,2)
);

with
    customer(id) as (select 562),
    items(productid,quantity) as (values(1489,2),(746,1),(1093,3)),
    newsale as (
        insert into testsales(customerid)
        select id FROM customer
        returning id
    ),
    addsaleitems as(
        insert into testitems(saleid,productid,quantity,price)
        select
            newsale.id, items.productid, items.quantity,100
        from newsale, items
        returning *
    )
update testsales
set total=(select sum(price*quantity) from addsaleitems)
from addsaleitems,newsale
where testsales.id=newsale.id;

在上面的示例中,前两个 CTE customeritems 只是为后面的内容提供值。 newsale CTE 在 table 中创建新行,addsaleitemsMany table 添加行,其余部分应该更新一个 table.

As documentedUPDATE 还看不到同一语句中插入的行。

诀窍是先计算总和,就在您将行插入 testsales 时。