以下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'(或等效)?
答案 0 :(得分:1)
CTE(WITH foo AS ...
)可以广泛地被认为是一个共享的子查询",并且在许多情况下可以用普通的子查询替换。
这是其中一种情况:const_threshold
的唯一用途是在子查询(SELECT * FROM const_threshold)
中,因此您可以直接将其替换为完整的子查询(SELECT max(id) FROM temp_menu_items)
。< / p>
这并不总是可行的 - 例如,CTE可以递归&#34;正常的子查询不能 - 并且可能不会导致相同的查询计划,所以一般的答案是没有直接的方法来做到这一点,而无需升级到较新版本的PostgreSQL。
对于这个例子,我相信结果应该是等价的,你只需要写两次相同的子查询(但当前的版本并不是完全简洁)。