如何将'with update'重写为 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.htmlhttps://www.postgresql.org/docs/9.4/static/queries-with.html

如何重写PostgreSQL 9.0的陈述?

或更一般:

在9.0版本的PostgreSql?

的9.0版中,有任何方法可以使用'with Update'(或等效(

cte( WITH foo AS ...(可以广泛地认为是"共享子问题",在许多情况下,可以用普通的子查询代替。

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

这并不总是可能的 - 例如,CTE可以以正常的子征服不能 - 并且可能不会导致相同的查询计划"递归",因此一般的答案是没有直接的方法这样做而无需升级到较新版本的PostgreSQL。

在此示例中,我相信结果应该等效,您只需要两次编写相同的子问题(但是当前版本并不完全简洁(。

相关内容

  • 没有找到相关文章

最新更新