簡體   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