簡體   English   中英

PostgreSQL WITH查詢,執行順序

[英]PostgreSQL WITH query, execution order

我正在嘗試從表中更新/刪除,然后通過內部聯接返回更新的數據,如下所示:

WITH removed AS (
  DELETE FROM cart
  WHERE cart.id = 1
  RETURNING *
)

SELECT cart.id, product.name, product.descr, product.price, cart.quantity
FROM cart INNER JOIN product
ON cart.product_id = product.id
WHERE cart.user_id = (SELECT user_id FROM removed);

但是,似乎主要的SELECT查詢在刪除之前返回,因此沒有反映更改。 從我在PostgreSQL文檔中讀到的內容:

WITH中的子語句彼此同時執行,並與主查詢同時執行。

在從表中更新/刪除之后,我可以使用另一種方法來返回 select 語句嗎?

就像您自己引用手冊一樣(盡管指向過時的 Postgres 9.1),在同一語句的 CTE 中所做的更改在基礎表中不可見。

我建議這種解決方法:

WITH removed AS (
   DELETE FROM cart
   WHERE id = 1
   RETURNING user_id
   )
SELECT c.id, p.name, p.descr, p.price, c.quantity
FROM   cart c
JOIN   product p ON c.product_id = p.id
WHERE  c.user_id = (SELECT user_id FROM removed);
AND    c.cart.id <> 1;  --  repreat negated filter from above

否則,您需要兩個單獨的語句(嵌套在同一個事務中)。 然后第二個(SELECT)將看到第一個的效果。 您只需要以某種方式記住受影響的user_id ...

只需在SELECTFROM子句中removed即可替換cart

WITH removed AS (
  DELETE FROM cart
  WHERE cart.id = 1
  RETURNING *
)
SELECT removed.id, product.name, product.descr, product.price, removed.quantity
FROM removed INNER JOIN product
ON removed.product_id = product.id ;

執行SELECT時,刪除的行不再存在於表cart中,但由於RETURNING子句,它們存儲在臨時表中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM