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

如何用T-SQL查询自引用表中指定ID的完整父级层级?

用递归CTE查询自引用表的所有父级记录

这事儿用递归CTE(Common Table Expression)来处理最顺手了,刚好T-SQL支持递归查询遍历这种层级结构。我给你写个具体的实现,假设你的表名叫Employees,字段是Id(主键)、ParentId(自引用外键)、Name(员工名称)——对应你例子里的那些字母:

具体查询语句

-- 定义要查询的目标ID
DECLARE @TargetId INT = 14;

WITH EmployeeHierarchy AS (
    -- 锚点成员:先获取目标ID对应的初始记录
    SELECT 
        Id,
        ParentId,
        Name,
        1 AS Level  -- 标记层级,方便后续排序
    FROM Employees
    WHERE Id = @TargetId

    UNION ALL

    -- 递归成员:逐层向上查找父级记录
    SELECT 
        e.Id,
        e.ParentId,
        e.Name,
        eh.Level + 1 AS Level
    FROM Employees e
    INNER JOIN EmployeeHierarchy eh 
        ON e.Id = eh.ParentId
    -- 终止条件:当父级ID等于自身时停止(对应你例子里的顶层记录1-1-b)
    -- 如果你的顶层记录ParentId是NULL,把这里改成 WHERE e.ParentId IS NOT NULL
    WHERE e.Id != e.ParentId
)

-- 按层级顺序输出指定格式的结果
SELECT 
    CONCAT('[', Id, ' - ', ParentId, ' - ', Name, ']') AS HierarchyItem
FROM EmployeeHierarchy
ORDER BY Level;

说明

  1. 递归CTE逻辑:
    • 锚点成员先定位到传入的目标ID记录(比如14);
    • 递归成员通过关联ParentId和上一层的Id,不断向上抓取父级记录,直到触发终止条件。
  2. 格式输出:用CONCAT函数拼接成你需要的[Id - ParentId - Name]格式。
  3. 适配调整:
    • 如果你的表名或字段名不同,直接替换对应的名称即可;
    • 如果顶层记录的ParentId是NULL而不是等于自身,把递归成员里的WHERE e.Id != e.ParentId改成WHERE e.ParentId IS NOT NULL。
  4. 参数化:如果需要经常调用,可以把这段逻辑封装成存储过程,方便传入不同的ID参数。

内容的提问来源于stack exchange,提问作者Babu Mannavalappil

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:46:46