使用通用 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 customer
和 items
只是为后面的内容提供值。 newsale
CTE 在 table 中创建新行,addsaleitems
向 Many
table 添加行,其余部分应该更新一个 table.
As documented,UPDATE
还看不到同一语句中插入的行。
诀窍是先计算总和,就在您将行插入 testsales
时。
我在一对多关系中有一对 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 customer
和 items
只是为后面的内容提供值。 newsale
CTE 在 table 中创建新行,addsaleitems
向 Many
table 添加行,其余部分应该更新一个 table.
As documented,UPDATE
还看不到同一语句中插入的行。
诀窍是先计算总和,就在您将行插入 testsales
时。