我有以下两张表
表人
Id Name
1 A
2 B
3 C
4 D
5 E
表关系层次结构
ParentId CHildId
2 1
3 2
4 3
这将形成一个树状结构
D
|
C
|
B
|
A
ParentId 和 ChildId 是 Person 表的 Id 列的外键
我需要编写可以获取我顶级父级的 SQL,即每个人的根。
以下 CTE 可以为 Each 执行此操作。我将它转换为一个函数并为每一行 Person 运行它。我在 Person 表中有大约 3k 行,这需要大约 10 秒。任何人都可以提出一种可以花费更少的方法。问题是在 CTE 之后运行的函数运行了 3k 次
DECLARE @childID INT
SET @childID = 1 --chield to search
;WITH RCTE AS
(
SELECT *, 1 AS Lvl FROM RelationHierarchy
WHERE ChildID = @childID
UNION ALL
SELECT rh.*, Lvl+1 AS Lvl FROM dbo.RelationHierarchy rh
INNER JOIN RCTE rc ON rh.CHildId = rc.ParentId
)
SELECT TOP 1 id, Name
FROM RCTE r
inner JOIN dbo.Person p ON p.id = r.ParentId
ORDER BY lvl DESC