-- ----------------------------------------------------------------------
-- author:jc_liumangtu(【DBA】小七)
-- date: 2010-03-30 15:09:42
-- version:
-- Microsoft SQL Server 2005 - 9.00.1399.06 (Intel X86)
-- Oct 14 2005 00:33:37
-- Copyright (c) 1988-2005 Microsoft Corporation
-- Developer Edition on Windows NT 5.1 (Build 2600: Service Pack 3)
--
-- ----------------------------------------------------------------------
use test
set nocount on
if object_id ( ' Dept ' , ' U ' ) is not null
drop table Dept
go
create table Dept(ID int ,ParentID int ,Name varchar ( 20 ))
insert into Dept select 1 , 0 , ' AA '
insert into Dept select 2 , 1 , ' BB '
insert into Dept select 3 , 1 , ' CC '
insert into Dept select 4 , 2 , ' DD '
insert into Dept select 5 , 3 , ' EE '
insert into Dept select 6 , 0 , ' FF '
insert into Dept select 7 , 6 , ' GG '
insert into Dept select 8 , 7 , ' HH '
insert into Dept select 9 , 7 , ' II '
insert into Dept select 10 , 7 , ' JJ '
insert into Dept select 11 , 9 , ' KK '
go
SELECT * FROM Dept;
-- 查询树状结构某节点的上级所有根节点。
with cte_root(ID,ParentID,NAME)
as
(
-- 起始条件
select ID,ParentID,NAME
from Dept
where Name = ' II ' -- 列出子节点查询条件
union all
-- 递归条件
select a.ID,a.ParentID,a.NAME
from Dept a
inner join
cte_root b -- 执行递归,这里就要理解下了
on a.ID = b.ParentID -- 根据基础表条件查询子节点(a.ID),通过CTE递归找到其父节点(b.ParentID)。
) -- 可以和下面查询子节点的cte_child对比。
select * from cte_root ;
-- 查询树状结构某节点下的所有子节点。
with cte_child(ID,ParentID,NAME)
as
(
-- 起始条件
select ID,ParentID,NAME
from Dept
where Name = ' II ' -- 列出父节点查询条件
union all
-- 递归条件
select a.ID,a.ParentID,a.NAME
from Dept a
inner join
cte_child b
on ( a.ParentID = b.ID) -- 根据查询到的父节点(a.Parent),通过CTE递归查询出其子节点(b.ID)
)
select * from cte_child -- 可以改变之前的查询条件'II'再测试结果
ID ParentID Name
-- --------- ----------- --------------------
1 0 AA
2 1 BB
3 1 CC
4 2 DD
5 3 EE
6 0 FF
7 6 GG
8 7 HH
9 7 II
10 7 JJ
11 9 KK
ID ParentID NAME
-- --------- ----------- --------------------
9 7 II
7 6 GG
6 0 FF
ID ParentID NAME
-- --------- ----------- --------------------
9 7 II
11 9 KK