加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

在SQL中查找顶级父级

发布时间:2020-12-12 08:30:17 所属栏目:MsSql教程 来源:网络整理
导读:我有两张桌子如下 表人 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 Table的Id列的外键 我需要编写可以抓取我顶级父级i-e根的SQL.任何人都可以建议任何可以帮助
我有两张桌子如下

表人

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 Table的Id列的外键

我需要编写可以抓取我顶级父级i-e根的SQL.任何人都可以建议任何可以帮助我实现这一点的SQL

解决方法

您可以使用 recursive CTE来实现:
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

SQLFiddle DEMO

编辑 – 针对所有孩子的最高级别的父母的更新请求:

;WITH RCTE AS
(
    SELECT  ParentId,ChildId,1 AS Lvl FROM RelationHierarchy 

    UNION ALL

    SELECT rh.ParentId,rc.ChildId,Lvl+1 AS Lvl 
    FROM dbo.RelationHierarchy rh
    INNER JOIN RCTE rc ON rh.ChildId = rc.ParentId
),CTE_RN AS 
(
    SELECT *,ROW_NUMBER() OVER (PARTITION BY r.ChildID ORDER BY r.Lvl DESC) RN
    FROM RCTE r

)
SELECT r.ChildId,pc.Name AS ChildName,r.ParentId,pp.Name AS ParentName
FROM CTE_RN r
INNER JOIN dbo.Person pp ON pp.id = r.ParentId
INNER JOIN dbo.Person pc ON pc.id = r.ChildId
WHERE RN =1

SQLFiddle DEMO

EDIT2 – 让所有的人改变JOINS一点点到底:

SELECT pc.Id AS ChildID,pp.Name AS ParentName
FROM dbo.Person pc 
LEFT JOIN CTE_RN r ON pc.id = r.CHildId AND  RN =1
LEFT JOIN dbo.Person pp ON pp.id = r.ParentId

SQLFiddle DEMo

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读