小春BOOK

导航

sql2005----cte----递归结构(递归、层级、全路径)

--1、创建表结构
CREATE TABLE [tb_loc](
    [id] [int],
    [name] [varchar](16),
    [parent] [int]
)
GO
--2、创建测试数据
INSERT tb_loc(id,name,parent) VALUES( 1,'河北省',NULL)
INSERT tb_loc(id,name,parent) VALUES( 2,'石家庄',1)
INSERT tb_loc(id,name,parent) VALUES( 3,'保定',1)
INSERT tb_loc(id,name,parent) VALUES( 4,'山西省',NULL)
INSERT tb_loc(id,name,parent) VALUES( 5,'太原',4)
INSERT tb_loc(id,name,parent) VALUES( 6,'新华区',2)
INSERT tb_loc(id,name,parent) VALUES( 7,'北焦村',6)
INSERT tb_loc(id,name,parent) VALUES( 8,'大郭村',6)
INSERT tb_loc(id,name,parent) VALUES( 9,'河南省',NULL)
INSERT tb_loc(id,name,parent) VALUES( 10,'大郭村南',8)
INSERT tb_loc(id,name,parent) VALUES( 11,'大郭村北',8)
INSERT tb_loc(id,name,parent) VALUES( 12,'北焦村东',7)
INSERT tb_loc(id,name,parent) VALUES( 13,'北焦村西',7)
INSERT tb_loc(id,name,parent) VALUES( 14,'桥东区',3)
INSERT tb_loc(id,name,parent) VALUES( 15,'桥西区',3)
GO
--3、递归结构
WITH locs(id,name,parent,loclevel,sortseq)AS(
    SELECT id,name,parent,1 AS loclevel,('.'+cast(id as varchar(MAX))) as sortseq
   FROM tb_loc WHERE parent IS NULL or len(parent)<=0
    UNION ALL
    SELECT l.id,l.name,l.parent,loclevel+1,cast((sortseq+'.'+cast(l.id as VARCHAR(MAX))) as VARCHAR(MAX))
   FROM tb_loc l INNER JOIN locs p ON l.parent=p.id
)
SELECT id,name,parent,loclevel,Replicate(' ',loclevel)+'┠'+name nameUnion,sortseq FROM locs order by sortseq
--4、删除表
drop table tb_loc

posted on 2009-12-22 17:44  xiaoc.li  阅读(322)  评论(0编辑  收藏  举报