[英]Postgres CTE query
with
supply as (
insert into "MOBILE_SUPPLIES" ("NAME", "TYPE") values ('Test2', 1) returning *
),
loc as (
insert into "MOBILE_LOCATIONS" ("LNG", "LAT", "SUPPLY_ID") values (31.232, 31.232, (select "ID" from supply)) returning *
),
up as (
update "MOBILE_SUPPLIES" set "LOCATION_ID"=(select "ID" from loc) where "ID"=(select "ID" from supply) returning *
)
insert into "MOBILE_DATES" ("DATE_FROM", "LOCATION_ID", "SUPPLY_ID") values (current_timestamp, (select "ID" from loc), (select "ID" from supply))
只是为了澄清我的 id 可以通过“ID”访问(它需要双引号,我知道这不是常见的做法)
我认为你的第三步应该是更新:
update "MOBILE_SUPPLIES"
set "LOCATION_ID"= my_data.loc_id
from (select loc."ID" as loc_id ,
supply."ID" as supply_id
from loc
inner join supply on loc."SUPPLY_ID" = supply."ID") as my_data
on my_data.supply_id="MOBILE_SUPPLIES"."ID"
returning *
如文档中所述,修改您在同一语句中添加的行将不起作用:
WITH
中的子语句彼此同时执行,并与主查询同时执行。 因此,在WITH
中使用数据修改语句时,指定更新实际发生的顺序是不可预测的。 所有语句都使用同一个快照执行(参见第 13 章),因此它们无法“看到”彼此对目标表的影响。 这减轻了行更新的实际顺序的不可预测性的影响,并且意味着RETURNING
数据是在不同的WITH
子语句和主查询之间传达更改的唯一方法。
我猜这个问题是关于自动生成的标识符, "MOBILE_SUPPLIES"
和"MOBILE_LOCATIONS"
中的行应该相互引用。
您可以通过显式获取序列值来做到这一点:
WITH new_loc_id AS (
SELECT nextval('"MOBILE_LOCATIONS_ID_seq"') AS "ID"
),
WITH supply AS (
INSERT INTO "MOBILE_SUPPLIES" ("NAME", "TYPE", "LOCATION_ID")
SELECT 'Test2', 1, "ID"
FROM new_loc_id
RETURNING "ID", "LOCATION_ID"
),
loc AS (
INSERT INTO "MOBILE_LOCATIONS" ("ID", "LNG", "LAT", "SUPPLY_ID")
SELECT "LOCATION_ID", 31.232, 31.232, "ID"
FROM supply
RETURNING "ID"
)
...
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.