SQL Server条件父子递归查询:库存套件层级过滤需求
修改SQL Server递归查询以满足套件节点不展开后代的需求
问题分析
你需要递归查询SKU1的所有后代,但当节点的isStockedAsKit为true时,仅保留该节点本身,不查询其下的子节点。原查询未对递归过程添加该限制,导致套件节点的后代也被查询出来。
修改后的查询代码
WITH level AS ( -- 初始节点:顶层物料SKU1 SELECT Parent, Child, 0 AS level_number, isStockedAsKit FROM [Bundles] WHERE Child = 'SKU1' UNION ALL -- 递归部分:仅当父节点不是套件时,才查询其子节点 SELECT child.Parent, child.Child, l.level_number + 1 AS level_number, child.isStockedAsKit FROM [Bundles] AS child JOIN level AS l ON l.Child = child.Parent AND l.isStockedAsKit = 0 -- 核心限制:父节点非套件才继续递归 ) SELECT level_number AS 'Lvl', Parent, Child, isStockedAsKit FROM level
关键修改点
- 在CTE中加入
isStockedAsKit字段:无论初始查询还是递归查询,都保留该字段,用于判断是否继续递归。 - 添加递归限制条件:在JOIN时增加
l.isStockedAsKit = 0(对应布尔值false),确保只有非套件节点的子节点才会被纳入递归查询。当父节点的isStockedAsKit为true时,不会继续查询其后代。 - 简化最终查询:直接从CTE中获取所有所需字段,避免原查询中可能存在的无效JOIN(原示例表无
ID字段,推测为笔误)。
验证结果
执行上述查询后,将得到你期望的结果:套件SKU4仅显示自身,其下的SKU2、SKU5不会被查询出来,其他非套件节点的后代正常展开。
内容的提问来源于stack exchange,提问作者ALUM22
相关产品推荐
相关产品推荐

