如何将 'with update' 重写为 postgresql 9.0

How to rewrite 'with update' to postgresql 9.0

以下 SQL 语句是为 PostgreSQL 9.4.15 编写的,它适用于此版本的 PostgreSQL。

WITH const_threshold AS (
    SELECT max(id)
    FROM temp_menu_items AS val
)
UPDATE temp_menu_items
SET id        = id + (SELECT parent_id
                      FROM temp_menu_items
                      WHERE parent_id IS NOT NULL
                      ORDER BY parent_id DESC
                      LIMIT 1) + (SELECT *
                                  FROM const_threshold)
  , parent_id = parent_id + (SELECT parent_id
                             FROM temp_menu_items
                             WHERE parent_id IS NOT NULL
                             ORDER BY parent_id DESC
                             LIMIT 1) + (SELECT *
                                         FROM const_threshold);

参考文档,Postgre 中没有更新SQL 9.0 https://www.postgresql.org/docs/9.0/static/queries-with.html https://www.postgresql.org/docs/9.4/static/queries-with.html

如何为 PostgreSQL 9.0 重写该语句?

或更一般地说:

有什么方法可以在 9.0 版本的 PostgreSQL?

中使用 'with update'(或等价物)

CTE (WITH foo AS ...) 可以广泛地视为 "shared sub-query",并且在许多情况下可以替换为正常的 sub-query。

这是其中一种情况:const_threshold 的唯一用途是在 sub-query (SELECT * FROM const_threshold) 中,因此您可以直接将其替换为完整的 sub-query (SELECT max(id) FROM temp_menu_items).

这并不总是可能的 - 例如,CTE 可以 "recursive" 以正常 sub-queries 不能的方式 - 并且可能不会产生相同的查询计划,所以一般的答案是如果不升级到更新版本的 PostgreSQL,就没有直接的方法可以做到这一点。

对于这个例子,我认为结果应该是等价的,你只需要将相同的 sub-query 写出两次即可(但目前的版本并不完全简洁)。