如何为此表编写嵌套查询?

时间:2012-12-15 19:05:11

标签: sql sql-server tsql

想象一下,我的数据库中有一个类似下表的表,如何编写一个返回所有地方的查询,这些地方是我用作此查询的输入的一部分?

例如,如果我发送:

(this is the input)   (I want this result)
1 (Europe)            France, Italy, Paris, PartA, PartAA
3 (France)            Paris, PartA, PartAA
4 (Paris)             PartA, PartAA

picture with example table

2 个答案:

答案 0 :(得分:1)

正如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

但这完全没有经过考验。

答案 1 :(得分:0)

递归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('')

唯一的小问题是列表中最后一个位置后面的逗号。您可以在查询中或稍后的代码中删除它。