在 SQL 服务器中使用 HierarchyId 构建的树中获取叶节点
Get leaf node in a tree built using HierarchyId in SQL Server
我在 SQL 服务器中使用 HierarchyId
数据类型。我必须写一些查询。
table由国家、地区和省(或区)组成。
我必须写两个查询:
- 我必须 return 所有最近的后代。
- 我必须 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];
我在 SQL 服务器中使用 HierarchyId
数据类型。我必须写一些查询。
table由国家、地区和省(或区)组成。
我必须写两个查询:
- 我必须 return 所有最近的后代。
- 我必须 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];