【发布时间】:2018-10-09 04:23:10
【问题描述】:
我在表中有一些初始行。我想用递归调用来修改它们。在我的示例代码中,这个函数是一个简单的乘以 2,我想执行 5 次:
WITH RECURSIVE cte (n,v) AS
(
-- initial values
SELECT 0,2
UNION ALL
SELECT 0,3
UNION ALL
-- generator
SELECT n + 1, v * 2 FROM cte WHERE n < 5
)
SELECT v FROM cte where n = 5;
它有效,但我的问题是它只在查询结束时过滤掉不需要的值。如果我从更多的行开始,它会降低性能,因为我应该在内存中有更多的行。是否可以仅在每次迭代中保留最新值?
SQLFiddle:http://sqlfiddle.com/#!5/9eecb7/6761
【问题讨论】:
-
@TimBiegeleisen 你知道这个代码在 MySQL 8.0 中是可能的,所以你可以通过删除 MySQL 标签来加快速度。
-
为什么这个问题同时被 MySQL 和 SQLite 标记?
-
@RaymondNijland 因为我正在寻找一种适用于两者的解决方案
-
“因为我正在寻找一种适用于两者的解决方案”-> 在 sqlfiddle.com 上提供带有示例数据的表结构,并将基于该示例数据的预期输出作为 ascii 表数据发布.. i '已经添加了 mysql 8.0 标签,因为 MySQL 8.0 是唯一允许公共表表达式(WITH AS 子句)的 MySQL 版本
-
我用 sqlfiddle 链接更新了问题。它提供了预期的输出,我只是在寻找更优化的解决方案
标签: mysql sql sqlite common-table-expression mysql-8.0