如何将 'with update' 重写为 postgresql 9.0
How to rewrite 'with update' to 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);
参考文档,Postgre 中没有更新SQL 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'(或等价物)
CTE (WITH foo AS ...
) 可以广泛地视为 "shared sub-query",并且在许多情况下可以替换为正常的 sub-query。
这是其中一种情况:const_threshold
的唯一用途是在 sub-query (SELECT * FROM const_threshold)
中,因此您可以直接将其替换为完整的 sub-query (SELECT max(id) FROM temp_menu_items)
.
这并不总是可能的 - 例如,CTE 可以 "recursive" 以正常 sub-queries 不能的方式 - 并且可能不会产生相同的查询计划,所以一般的答案是如果不升级到更新版本的 PostgreSQL,就没有直接的方法可以做到这一点。
对于这个例子,我认为结果应该是等价的,你只需要将相同的 sub-query 写出两次即可(但目前的版本并不完全简洁)。
以下 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);
参考文档,Postgre 中没有更新SQL 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'(或等价物)CTE (WITH foo AS ...
) 可以广泛地视为 "shared sub-query",并且在许多情况下可以替换为正常的 sub-query。
这是其中一种情况:const_threshold
的唯一用途是在 sub-query (SELECT * FROM const_threshold)
中,因此您可以直接将其替换为完整的 sub-query (SELECT max(id) FROM temp_menu_items)
.
这并不总是可能的 - 例如,CTE 可以 "recursive" 以正常 sub-queries 不能的方式 - 并且可能不会产生相同的查询计划,所以一般的答案是如果不升级到更新版本的 PostgreSQL,就没有直接的方法可以做到这一点。
对于这个例子,我认为结果应该是等价的,你只需要将相同的 sub-query 写出两次即可(但目前的版本并不完全简洁)。