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

前端之家收集整理的这篇文章主要介绍了Sql HierarchyId如何获取最后的后代?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
使用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)

猜你在找的MsSQL相关文章