我正在嘗試從表中更新/洗掉,然后通過這樣的內部連接回傳更新的資料:
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 陳述句?
uj5u.com熱心網友回復:
就像您自己參考了手冊一樣(盡管指向過時的 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; -- repeat negated filter from above
<>是“不等于”運算子,是 的反義詞=。cart.id <> 1排除要洗掉的行WHERE id = 1。
否則,您需要兩個單獨的陳述句(嵌套在同一個事務中)。第二個 (SELECT) 然后會看到第一個的效果。你只需要以user_id某種方式記住受影響的人......
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/384187.html
標籤:sql PostgreSQL的 公用表表达式
