如何在表示层次结构的表中找到最顶层的记录(在TSQL中)?
想象一张如下表: 表格:人 字段:ID、全名、父ID 其中ParentID再次引用Person表中的ID 问题:如何在表示层次结构的表中找到最顶层的记录(在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
对于上面给出的示例,我如何在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
你可能想要一个,你可能想要一个。