首页 > 解决方案 > 如何找到同一张表的父行

问题描述

我有这样的表:

childId | parentId
   1    |  null
   2    |   1
   3    |  null
   4    |   2

列 childId 是该表的主键,parentId 是同一个表的外键,并引用列 (childId)。

我需要调用一个函数并发送参数(childId),函数会找到这个孩子的最父行。

示例:如果我通过 childId = 4,则输出结果需要为 1。

这个问题有什么解决办法吗?

编辑:

我需要像层次结构顶级行之类的东西。我曾尝试使用递归 CTE,但无法完成。

标签: sqlsql-servertsqlrecursive-query

解决方案


看起来递归 CTE(公用表表达式)非常适合这种类型的查询。

样本数据

DECLARE @T TABLE (childId int, parentId int);

INSERT INTO @T VALUES
(   1    ,   null),
(   2    ,    1  ),
(   3    ,   null),
(   4    ,    2  );

询问

用参数替换常量4。我包括在内AnchorChildIDAnchorParentID以便更容易理解结果和正在发生的事情。在没有最终过滤器的情况下运行此查询WHERE ParentID IS NULL以查看它是如何工作的。

WITH
CTE
AS
(
    SELECT
        childId AS AnchorChildID
        ,parentId AS AnchorParentID
        ,childId AS ChildID
        ,parentId AS ParentID
    FROM @T AS T
    WHERE childId = 4

    UNION ALL

    SELECT
        CTE.AnchorChildID
        ,CTE.AnchorParentID
        ,T.ChildID
        ,T.ParentID
    FROM
        CTE
        INNER JOIN @T AS T ON T.ChildID = CTE.ParentID
)
SELECT ChildID
FROM CTE
WHERE ParentID IS NULL
OPTION(MAXRECURSION 0)
;

结果

ChildID
1

推荐阅读