在 SQL 服务器中使用 HierarchyId 构建的树中获取叶节点

Get leaf node in a tree built using HierarchyId in SQL Server

我在 SQL 服务器中使用 HierarchyId 数据类型。我必须写一些查询。

table由国家、地区和省(或区)组成。

我必须写两个查询:

  1. 我必须 return 所有最近的后代。
  2. 我必须 return 所有叶子。

我解决了第一个查询,但没有解决第二个问题:

SELECT * 
INTO #parents 
FROM ado.country_subdivisions parents 
WHERE  isocode = 'ES' 

SELECT * 
FROM ado.country_subdivisions cs
WHERE IsoCode IN (SELECT cs.IsoCode
                  FROM #parents p
                  WHERE cs.Level.IsDescendantOf(p.Level) = 1
                    AND p.CountryISOAlpha2Code = cs.CountryISOAlpha2Code
                    AND (cs.Level.GetLevel() = p.Level.GetLevel() + 1)
                 )   

我明白了

我想我必须只改变这个来解决第二个查询

AND (cs.Level.GetLevel() = p.Level.GetLevel() + 1)

类似

(SELECT MAX(leaf.Level.GetLevel()) FROM ado.country_subdivisions leaf WHERE leaf.Level.IsDescendantOf(cs.Level) = 1)

但是我只得到省份...但是我有一些没有省份的地区..所以我希望得到没有省份的省份和地区。

这里的例子...似乎在例子中有效,所以我不明白本地有什么问题:(

http://sqlfiddle.com/#!18/46cbd/1

有什么想法吗?

谢谢

假设您的意思是“叶子”是“树中没有任何后代的节点”,您将需要这样的东西:

select cs.*,
    cs.[Level].ToString()
from dbo.country_subdivisions as cs
join dbo.parent as p
    on cs.[Level].IsDescendantOf(p.[Level]) = 1
    and p.CountryISOAlpha2Code = cs.CountryISOAlpha2Code
where not exists (
   select 1
   from Dbo.country_subdivisions as child
   where child.[Level].IsDescendantOf(cs.[Level]) = 1
      and child.[Level] <> cs.[Level]
)
order by cs.[Level];