SQL反向关联查询技巧_SQL从子结构查父级实例

admin 百科 26
用递归CTE可一次性自下而上查出子记录的完整祖先路径;锚点查子节点,递归JOIN回表按parent_id向上追溯,配合level计数与字符串拼接生成可读路径,需索引parent_id并限制递归深度以防性能问题。

SQL反向关联查询技巧_SQL从子结构查父级实例-第1张图片-佛山资讯网

想从子记录快速找到它的父级、祖父级甚至更上层的祖先?SQL反向关联查询就是干这个的——不靠多次JOIN,也不手动写N层嵌套,而是用递归CTE(Common Table Expression)一次性查出完整路径。

用递归CTE实现自下而上的层级追溯

核心是定义一个锚点(子节点)+ 递归成员(向上找parent_id),数据库会自动迭代直到找不到父级为止。适用于有明确父子关系字段(如idparent_id)的表,比如部门、分类、评论回复链。

  • 锚点部分写“你要查的子记录”,比如WHERE id = 123
  • 递归部分JOIN回同一张表,条件是t.parent_id = cte.id(注意方向:从子往父跳)
  • 必须加MAXRECURSION限制(SQL Server)或CYCLE检测(PostgreSQL/Oracle),防无限循环

查出完整祖先路径(含层级和名称)

不只是ID,还要看“部门A → 部门B → 总部”这样的可读路径?在递归CTE里用字符串拼接+层级计数即可:

  • 初始化level = 1,每次递归level + 1
  • 路径字段如path = CAST(name AS VARCHAR(500)),递归时拼成t.name + ' → ' + cte.path
  • 最后ORDER BY level DESC就能从顶到下排列

MySQL 8.0+也支持,但写法稍不同

MySQL不用WITH RECURSIVE开头,但逻辑一致。注意初始查询必须是“单表无JOIN”,且递归查询中只能引用CTE本身一次:

标签: mysql oracle 排列

发布评论 0条评论)

还木有评论哦,快来抢沙发吧~

趣科技 机圈观察员 茄考网 茄录网 海印网 雷鹃网 鹃朝网 互联网观察员 评测官
趣科技 机圈观察员 茄考网 茄录网 海印网 雷鹃网 鹃朝网 互联网观察员 评测官