如何在表示层次结构的表中找到最顶层的记录(在TSQL中)?

如何在表示层次结构的表中找到最顶层的记录(在TSQL中)?,sql,sql-server,tsql,hierarchy,Sql,Sql Server,Tsql,Hierarchy,想象一张如下表: 表格:人 字段:ID、全名、父ID 其中ParentID再次引用Person表中的ID 问题: 对于上面给出的示例,我如何在TSQL中查询以找到ID=7的人的最高父级?如果要测试该查询,应该可以 WITH abcd AS ( -- anchor SELECT id, FullName, ParentID, FullName AS "Pa

想象一张如下表:

表格:

字段:ID、全名、父ID

其中ParentID再次引用Person表中的ID

问题:
对于上面给出的示例,我如何在TSQL中查询以找到ID=7的人的最高父级?

如果要测试该查询,应该可以

WITH  abcd
            AS (
                  -- anchor
                SELECT  id, FullName, ParentID,
                        FullName AS "Path"
                FROM    Person
                WHERE   ParentId IS NULL
                UNION ALL
                  --recursive member
                SELECT  p.id, p.FullName, p.ParentID,
                        CAST((a.path + '/' + p.FullName) AS VARCHAR(1000)) AS "Path"
                FROM    Person AS p
                        JOIN abcd AS a
                          ON p.ParentId = a.id
               )
    SELECT * FROM abcd

如果您想测试该查询,它应该是确定的

WITH  abcd
            AS (
                  -- anchor
                SELECT  id, FullName, ParentID,
                        FullName AS "Path"
                FROM    Person
                WHERE   ParentId IS NULL
                UNION ALL
                  --recursive member
                SELECT  p.id, p.FullName, p.ParentID,
                        CAST((a.path + '/' + p.FullName) AS VARCHAR(1000)) AS "Path"
                FROM    Person AS p
                        JOIN abcd AS a
                          ON p.ParentId = a.id
               )
    SELECT * FROM abcd

您可以使用公共表表达式并执行递归查询,直到找到最顶层的父级,如下所示:

DECLARE @id INT
SET @id = 5 

CREATE TABLE #tmp (id INT , ParentId INT)
INSERT INTO #tmp VALUES(1,0)
INSERT INTO #tmp VALUES(2,1)
INSERT INTO #tmp VALUES(3,2);
INSERT INTO #tmp VALUES(4, 3);
INSERT INTO #tmp VALUES(5,4);

    WITH parent AS
    (
        SELECT id, parentId  from #tmp WHERE id = @id
        UNION ALL 
        SELECT t.id, t.parentId FROM parent
        INNER JOIN #tmp t ON t.id =  parent.parentid
    )

    SELECT TOP 1 id FROM  parent
    order by id asc

DROP TABLE #tmp

您可以使用公共表表达式并执行递归查询,直到找到最顶层的父级,如下所示:

DECLARE @id INT
SET @id = 5 

CREATE TABLE #tmp (id INT , ParentId INT)
INSERT INTO #tmp VALUES(1,0)
INSERT INTO #tmp VALUES(2,1)
INSERT INTO #tmp VALUES(3,2);
INSERT INTO #tmp VALUES(4, 3);
INSERT INTO #tmp VALUES(5,4);

    WITH parent AS
    (
        SELECT id, parentId  from #tmp WHERE id = @id
        UNION ALL 
        SELECT t.id, t.parentId FROM parent
        INNER JOIN #tmp t ON t.id =  parent.parentid
    )

    SELECT TOP 1 id FROM  parent
    order by id asc

DROP TABLE #tmp
你可能想要一个,你可能想要一个。