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

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语法/逻辑错误

  1. 锚点查询的IN子句缺少右括号,无法正常执行
  2. 递归部分关联条件写错,t.ID=v.val1中的别名v不存在,正确关联逻辑应为子节点的父ID关联CTE中已查询的节点ID
  3. 递归部分的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.08 13:57:02