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.htmlhttps://www.postgresql.org/docs/9.4/static/queries-with.html
如何重写PostgreSQL 9.0的陈述?
或更一般:
在9.0版本的PostgreSql?
cte( WITH foo AS ...
(可以广泛地认为是"共享子问题",在许多情况下,可以用普通的子查询代替。
这是其中一种情况:const_threshold
的唯一用法是在子查询(SELECT * FROM const_threshold)
中,因此您可以直接用完整的子查询(SELECT max(id) FROM temp_menu_items)
替换。
这并不总是可能的 - 例如,CTE可以以正常的子征服不能 - 并且可能不会导致相同的查询计划"递归",因此一般的答案是没有直接的方法这样做而无需升级到较新版本的PostgreSQL。
在此示例中,我相信结果应该等效,您只需要两次编写相同的子问题(但是当前版本并不完全简洁(。