我的父母表看起来像这样
CHILD_ID | PARENT_ID | NAME
1 | Null | Bill
2 | 1 | Jane
3 | 1 | Steve
4 | 2 | Ben
5 | 3 | Andrew
我想获得像这样的结果集
Bill
---Jane
------Ben
---Steve
------Andrew
我知道我需要做一个排名查询来排名水平和自我加入,但我能在网上找到的只是CTE递归
我之前已在Oracle中完成此操作,但未在MS SQL中完成此操作
答案 0 :(得分:10)
有点hacky,可以改进,但希望它显示原则......
;with relation (childId, parentId, childName, [level], [orderSequence])
as
(
select childId, parentId, childName, 0, cast(childId as varchar(20))
from @parents
where parentId is null
union all
select p.childId, p.parentId, r.[level]+1, cast(r.orderSequence + '_' + cast(p.childId as varchar) as varchar(20))
from @parents p
inner join relation r on p.parentId = r.childId
)
select right('----------', ([level]*3)) +childName
from relation
order by orderSequence
如果您想避免递归,那么另一种方法是使用相关的树结构信息实现树表 - 请参阅http://www.sqlteam.com/article/more-trees-hierarchies-in-sql了解
答案 1 :(得分:3)
declare @pc table(CHILD_ID int, PARENT_ID int, [NAME] varchar(80));
insert into @pc
select 1,NULL,'Bill' union all
select 2,1,'Jane' union all
select 3,1,'Steve' union all
select 4,2,'Ben' union all
select 5,3,'Andrew' union all
select 6,NULL,'Tom' union all
select 7,8,'Dick' union all
select 8,6,'Harry' union all
select 9,3,'Stu' union all
select 10,7,'Joe';
; with r as (
select CHILD_ID, PARENT_ID, [NAME], depth=0, sort=cast(CHILD_ID as varchar(max))
from @pc
where PARENT_ID is null
union all
select pc.CHILD_ID, pc.PARENT_ID, pc.[NAME], depth=r.depth+1, sort=r.sort+cast(pc.CHILD_ID as varchar(30))
from r
inner join @pc pc on r.CHILD_ID=pc.PARENT_ID
where r.depth<32767
)
select tree=replicate('-',r.depth*3)+r.[NAME]
from r
order by sort
option(maxrecursion 32767);
这是一个艰难的:)。我将示例扩展为包括&gt; 1棵树。结果到目前为止看起来不错。
答案 2 :(得分:1)
WITH DirectReports (ParentUniqId, UniqId, SortID)
AS
(
SELECT e.ParentUniqId, e.UniqId, e.UniqId as SortID
FROM Coding.Coding AS e
WHERE isnull(ParentUniqId ,0)=0
UNION ALL
SELECT e.ParentUniqId, e.UniqId,, d.SortID * 100 + e.UniqId as SortID
FROM Coding.Coding AS e
INNER JOIN DirectReports AS d
ON e.ParentUniqId = d.UniqId
)
SELECT ParentUniqId, Perfix,SortID
FROM DirectReports order by rtrim(SortID) , uniqid