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

时间:2018-02-19 17:45:05

标签: sql postgresql 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);

在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'(或等效)?

1 个答案:

答案 0 :(得分:1)

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

这是其中一种情况:const_threshold的唯一用途是在子查询(SELECT * FROM const_threshold)中,因此您可以直接将其替换为完整的子查询(SELECT max(id) FROM temp_menu_items)。< / p>

这并不总是可行的 - 例如,CTE可以递归&#34;正常的子查询不能 - 并且可能不会导致相同的查询计划,所以一般的答案是没有直接的方法来做到这一点,而无需升级到较新版本的PostgreSQL。

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