You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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;

代码逻辑拆解

  1. 锚点成员:把Table1里需要查询的SectionID和Table2关联,直接拿到这些节点的第一层子节点(比如你例子中20000448的直接子20000449、20000450等)。
  2. 递归成员:将上一轮查询到的子节点作为新的父节点,继续查询它们的子节点,这个过程会自动循环,直到找不到更多子节点为止。
  3. 最终查询:用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 06:43:53