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

Sql HierarchyId如何获取最后的后代?

发布时间:2020-12-12 07:07:23 所属栏目:MsSql教程 来源:网络整理
导读:使用t-sql hierarchy Id如何获得所有没有子节点的行(这是最后的后代)? 说我的表结构如下: Id,Name,HierarchyId 并有这些行: 1,Craig,/2,Steve,/1/3,John,/1/1/4,Sam,/2/5,Matt,/2/1/6,Chris,/2/1/1/ 什么查询会给我约翰和克里斯? 解决方法 也许有更好的方
使用t-sql hierarchy Id如何获得所有没有子节点的行(这是最后的后代)?

说我的表结构如下:

Id,Name,HierarchyId

并有这些行:

1,Craig,/
2,Steve,/1/
3,John,/1/1/

4,Sam,/2/
5,Matt,/2/1/
6,Chris,/2/1/1/

什么查询会给我约翰和克里斯?

解决方法

也许有更好的方法,但这种接缝可以完成这项工作.
declare @T table
(
  ID int,Name varchar(10),HID HierarchyID
)

insert into @T values
(1,'Craig','/'),(2,'Steve','/1/'),(3,'John','/1/1/'),(4,'Sam','/2/'),(5,'Matt','/2/1/'),(6,'Chris','/2/1/1/')

select *
from @T
where HID.GetDescendant(null,null) not in (select HID 
                                            from @T)

结果:

ID          Name       HID
----------- ---------- ---------------------
3           John       0x5AC0
6           Chris      0x6AD6

更新2012-05-22

如果节点编号不是完整的序列,则上述查询将失败.这是另一个应该处理的版本.

declare @T table
(
  ID int,'/2/1/2/') -- HID for this row is changed compared to above query

select *
from @T
where HID not in (select HID.GetAncestor(1)
                  from @T
                  where HID.GetAncestor(1) is not null)

(编辑:李大同)

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

    推荐文章
      热点阅读