SQL 如何用递归 CTE 计算层级路径或全路径字符串-SQL

递归CTE必须先定义锚点再写递归成员,顺序不可颠倒;需用UNION ALL连接,显式处理空值拼接路径,WHERE仅限锚点或最终结果过滤,防环需依赖数据库特性或手动实现。

递归 CTE 必须定义锚点和递归成员,且顺序不能颠倒

SQL Server、PostgreSQL(14+)、Oracle 都支持递归 CTE,但语法细节有差异。核心是两部分必须显式分开:WITH RECURSIVE(PostgreSQL)或 WITH(SQL Server),然后先写锚点查询(即最顶层节点),再用 UNION ALL 连接递归查询。如果把递归部分写在前面,或用了 UNION(去重),会直接报错或结果异常。

常见错误现象:Maximum recursion exceeded(SQL Server)、recursive reference must be in FROM clause(PostgreSQL)。这是因为递归调用没正确引用自身别名,或没限制层级深度。

  • 锚点部分只能查出根节点(例如 parent_id IS NULL 或 level = 1)
  • 递归部分的 FROM 必须包含 CTE 自身的别名(如 FROM tree t JOIN cte ON t.parent_id = cte.id)
  • SQL Server 默认递归上限 100 层,超限需加 OPTION (MAXRECURSION n),设为 0 表示无限制(慎用)

拼接全路径字符串要用字符串聚合,注意空值和分隔符位置

层级路径本质是把祖先节点名按从顶到底顺序连起来,比如 'A/B/C'。不能依赖递归中的简单 + 或 || 拼接,因为初始锚点没有父路径,必须显式处理空值;否则会出现 NULL/B/C 或整个字段变 NULL。

不同数据库处理方式不同:

  • SQL Server:用 ISNULL(cte.path, '') + '/' + t.name,锚点中 path 初始化为 t.name
  • PostgreSQL:用 COALESCE(cte.path || '/', '') || t.name,更安全;锚点中 path 设为 t.name::TEXT
  • Oracle:用 COALESCE(cte.path || '/', '') || t.name,但需确保字段类型一致(避免隐式转换失败)

如果路径含斜杠、反斜杠等特殊字符,建议提前 REPLACE 转义,否则后续解析困难。

夏夕资源网专注于CMS网站模板,主流语言整站网站源码下载,网站建设相关教程分享,好用的软件素材整合下载,提供一站式便捷自助服务。
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!
7. 如遇到加密压缩包,默认解压密码为"zy.lucklyus.top",如遇到无法解压的请联系管理员!
夏夕资源网-网站模板_免费源码_资源素材 » SQL 如何用递归 CTE 计算层级路径或全路径字符串-SQL
在线时间:12:00 - 22:00
关注微信公众号:微信公众号
站长邮箱:[email protected]
  • 运营天数: 1391+
  • 资源总数: 47989+
  • 用户总数: 1+
  • 今日更新: 0+
  • 访问次数: 3995959+
  • 本周更新: 0+
  • 最后更新: 2026-03-16

本站指数

×
  • 运营天数: 1391+
  • 资源总数: 47989+
  • 用户总数: 1+
  • 今日更新: 0+
  • 访问次数: 3995959+
  • 本周更新: 0+
  • 最后更新: 2026-03-16