SQL Server位运算实现父子ID视图返回结果异常问题求助
问题根因排查
核心错误1:锚点筛选逻辑错误
17的二进制为10001,对应十进制的1+16,你当前锚点用的筛选条件val & 17 <> 0会把包含最低位1或者第5位16的类型全部筛选为根节点:
- N类型val=1:
1&17=1<>0,符合根节点要求 - SU类型val=16:
16&17=16<>0,符合根节点要求 - M类型val=27:
27&17=17<>0,符合根节点要求 - C类型val=11:
11&17=1<>0,不符合根节点要求但被误选入锚点,导致ID=8838直接在锚点返回自身作为ParentID,没有进入递归逻辑。
核心错误2:SQL语法/逻辑错误
- 锚点查询的
IN子句缺少右括号,无法正常执行 - 递归部分关联条件写错,
t.ID=v.val1中的别名v不存在,正确关联逻辑应为子节点的父ID关联CTE中已查询的节点ID - 递归部分的
ID IN (...)没有指定表别名,会出现字段歧义,导致筛选逻辑失效
修复后的视图代码
CREATE OR ALTER VIEW V1 (ChildID, ParentID) AS WITH MyCTE (ChildID, ParentID) AS ( -- 锚点:仅N/M/SU类型作为根节点,返回自身作为ParentID SELECT t.C_ID AS ChildID, t.C_ID AS ParentID FROM tablex t LEFT JOIN tabley y ON t.C_ID = y.ID LEFT JOIN tabletype tt ON y.type = tt.TYPE WHERE t.val1 IS NULL -- 明确筛选N/M/SU作为根节点,排除C类型 OR tt.TYPE IN ('N','M','SU') UNION ALL -- 递归:C类型节点向上取父节点的ParentID SELECT t.C_ID AS ChildID, M.ParentID FROM tablex t INNER JOIN MyCTE M ON t.val1 = M.ChildID -- 子节点的父ID关联CTE的已查询节点 INNER JOIN tabley y ON t.C_ID = y.ID INNER JOIN tabletype tt ON y.type = tt.TYPE WHERE tt.TYPE = 'C' -- 仅C类型进入递归逻辑 ) SELECT DISTINCT ChildID, ParentID FROM MyCTE
执行后即可返回你预期的结果:
ChildID ParentID ------------------ 8838 8834 8822 8822
内容的提问来源于stack exchange,提问作者satcha
相关产品推荐
相关产品推荐

