【问题标题】:PostgreSQL WITH query, execution orderPostgreSQL WITH 查询,执行顺序
【发布时间】:2022-01-20 14:50:15
【问题描述】:

我正在尝试从表中更新/删除,然后通过内部连接返回更新后的数据,如下所示:

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 语句吗?

【问题讨论】:

    标签: sql postgresql common-table-expression


    【解决方案1】:

    就像您自己引用 the manual 一样(尽管指向过时的 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
    

    &lt;&gt; is the "not equal" operator= 的反义词。 cart.id &lt;&gt; 1 不包括要使用WHERE id = 1 删除的行。

    否则,您需要两个单独的语句(嵌套在同一个事务中)。然后第二个(SELECT)将看到第一个的效果。你只需要以某种方式记住受影响的user_id ...

    【讨论】:

    • 感谢您的回答和对我原始查询的改进。我也会将您的解决方法用于我的更新声明。不确定我是否完全理解 位的作用!
    • 我认为这很明显。添加了更多解释。
    • 不知何故我以前没有遇到过 运算符。很明显,现在你已经解释过了。谢谢,
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-02
    • 1970-01-01
    • 2021-07-19
    • 2014-07-30
    • 1970-01-01
    • 2020-04-11
    • 2018-02-06
    相关资源
    最近更新 更多