CTE查询进入死循环

WITH RECURSIVE cte_connect_by As(
SELECT
s.insid,
s.supr_inst_ecd
from
xxxxxx s
where
insid = '320000001 'UNION ALL
SELECT
s.insid,
s.supr_inst_ecd
Form
etc_connect_by_r
inner join xxxxxx s ON r.super_inst_ecd = s.insid
) SELECT
insid
FROM
cte_connect_by
ORER BY
insid;
项目反馈报错:“Recursivequery aborted after 10011terat1ons.Try increasing @cte max recursion depth to a larger value”这个错误,

这么简单就别用cte了,tidb的cte不少bug,尤其和union all一起

递归 CTE 必带 union all 吧

首先,格式化一下sql。

WITH RECURSIVE cte_connect_by As(
    SELECT s.insid,s.supr_inst_ecd FROM xxxxxx s
    WHERE insid = '320000001 '
    UNION ALL
    SELECT s.insid,s.supr_inst_ecd FROM etc_connect_by_r
    INNER JOIN xxxxxx s ON r.super_inst_ecd = s.insid
) 
SELECT insid FROM cte_connect_by
ORDER BY insid;

然后,这个应该是参数控制的吧,调大参数试试

1 个赞

https://docs.pingcap.com/zh/tidb/stable/system-variables#cte_max_recursion_depth

这递归1000次都用完了?

我感觉即使调大运行也会非常久,想象一下一颗1000层的树。最小也是2的1000次方。过于离谱。
应该评估一下这个做法是否合理了。

确实,不知道实际表结构和数据,估计大概率还是业务逻辑循环了。

1 个赞

您遇到的错误信息表明您的查询在执行递归操作时超出了预设的最大递归深度。在SQL中,特别是在使用Common Table Expressions (CTEs) 进行递归查询时,每个数据库管理系统都会设定一个最大递归深度的限制,以防止无限递归导致的资源耗尽或程序崩溃。

逻辑不复杂,不用CTE吧~

增加 CTE的最大递归深度

此话题已在最后回复的 7 天后被自动关闭。不再允许新回复。