如何用SQL查询获取Table1中SectionID的所有嵌套子ID?
解决树形结构中获取指定节点所有嵌套子节点的问题
我来帮你搞定这个递归查询的问题——递归CTE确实是处理这种层级嵌套数据的标准方案,你之前没得到预期结果大概率是锚点或递归逻辑写得不对。下面直接给你适配需求的代码,再拆解说明:
完整的递归CTE查询语句
WITH RecursiveChildNodes AS ( -- 锚点成员:先获取Table1中目标节点的**直接子节点** SELECT t2.ChildID FROM Table1 t1 INNER JOIN Table2 t2 ON t1.SectionID = t2.ParentID UNION ALL -- 递归成员:循环获取子节点的子节点(孙、曾孙...直到没有下层级) SELECT t2.ChildID FROM RecursiveChildNodes r INNER JOIN Table2 t2 ON r.ChildID = t2.ParentID ) -- 去重后输出所有嵌套子节点 SELECT DISTINCT ChildID FROM RecursiveChildNodes;
代码逻辑拆解
- 锚点成员:把Table1里需要查询的SectionID和Table2关联,直接拿到这些节点的第一层子节点(比如你例子中20000448的直接子20000449、20000450等)。
- 递归成员:将上一轮查询到的子节点作为新的父节点,继续查询它们的子节点,这个过程会自动循环,直到找不到更多子节点为止。
- 最终查询:用
DISTINCT是为了避免可能出现的重复数据(比如某个节点被多个父节点关联的情况),确保结果唯一。
针对你例子的验证
如果Table1里有20000448,这个查询会:
- 先拿到它的直接子节点:20000449、20000450、20000452
- 接着递归查询20000449的子节点:20000543
- 再查询20000543的子节点:20000544等
- 同时也会处理20000450的所有子节点,直到把所有嵌套层级的子节点都捞出来,完全符合你预期的结果。
额外提示
如果后续需要包含原SectionID本身(比如要把20000448也加入结果),只需要修改锚点成员,把原节点加进去:
-- 修改后的锚点成员 SELECT t1.SectionID AS ChildID -- 把原节点也纳入 FROM Table1 t1 UNION ALL SELECT t2.ChildID FROM Table1 t1 INNER JOIN Table2 t2 ON t1.SectionID = t2.ParentID
内容的提问来源于stack exchange,提问作者Sarat
相关产品推荐
相关产品推荐

