繁体   English   中英

Postgres CTE 查询

[英]Postgres CTE query

  1. 我想在返回 id1 的 table1 中插入一个新行。
  2. 然后使用 id1 将行插入 table2 返回 id2。
  3. 然后用 id2 更新 table1 以创建关系。
  4. 最后,同时使用 id1 和 id2 插入到 table3 中。 我创建了一个 CTE,但它似乎没有执行第三步(使用 id2 更新 table1)。 我怎样才能让它正确地完成所有步骤?
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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM