想象一下,我的数据库中有一个类似于下表的表,我如何编写一个查询来返回作为该查询输入的地方的一部分的所有地方?
例如,如果我发送:
(this is the input) (I want this result)
1 (Europe) France, Italy, Paris, PartA, PartAA
3 (France) Paris, PartA, PartAA
4 (Paris) PartA, PartAA
想象一下,我的数据库中有一个类似于下表的表,我如何编写一个查询来返回作为该查询输入的地方的一部分的所有地方?
例如,如果我发送:
(this is the input) (I want this result)
1 (Europe) France, Italy, Paris, PartA, PartAA
3 (France) Paris, PartA, PartAA
4 (Paris) PartA, PartAA
正如 Martin Smith 所建议的,我查看了递归 CTE,这就是我想出的:
with place_hierarchy (code, place, parent_code)
as (
select p.code, p.place, p.parent_code
from places p
where p.code = :code
union all
select p.code, p.place, p.parent_code
from places p
inner join place_hierarchy ph on p.parent_code = ph.code
)
select ph.place
from place_hierarchy ph
不过,它完全未经测试。
递归 CTE 构建子树,将所有位置聚合到单行。
with placesreq(code, place, parent, depth)
as
(
select code, place, parentCode, 0 as depth
from places
where place = 'France'
union all
select p.code, p.place, p.parentCode, r.depth+1
from places as p
join placesreq as r on r.code = p.parentCode
)
select place+',' as 'data()'
from placesreq
where depth > 0
for xml path('')
唯一的小问题是列表中最后一个位置后面的逗号。您可以在查询中或稍后在代码中摆脱它。