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);

参考文档,PostgreSQL 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”(或等效)?

4

1 回答 1

1

CTE ( WITH foo AS ...) 可以广泛地被认为是“共享子查询”,并且在许多情况下可以替换为普通子查询。

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

这并不总是可能的——例如,CTE 可以以普通子查询不能的方式“递归”——并且可能不会导致相同的查询计划,所以一般的答案是没有直接的方法来做到这一点无需升级到更新版本的 PostgreSQL。

对于这个例子,我相信结果应该是等价的,你只需要写两次相同的子查询(但当前版本并不完全简洁)。

于 2018-02-19T18:04:01.833 回答