直接进入正题
比如一个表,有id和pId字段,id是主键,pid表示它的上级节点,表结构和数据:
CREATE TABLE [aaa](
[id] [int] NULL, [pid] [int] NULL, [name] [nchar](10))GOINSERT INTO aaa VALUES(1,0,'a')INSERT INTO aaa VALUES(2,0,'b')INSERT INTO aaa VALUES(3,1,'c')INSERT INTO aaa VALUES(4,1,'d')INSERT INTO aaa VALUES(5,2,'e')INSERT INTO aaa VALUES(6,3,'f')INSERT INTO aaa VALUES(7,3,'g')INSERT INTO aaa VALUES(8,4,'h')GO--下面的Sql是查询出1结点的所有子结点with my1 as(select * from aaa where id = 1 union all select aaa.* from my1, aaa where my1.id = aaa.pid)select * from my1 --结果包含1这条记录,如果不想包含,可以在最后加上:where id <> 1--下面的Sql是查询出8结点的所有父结点with my1 as(select * from aaa where id = 8 union all select aaa.* from my1, aaa where my1.pid = aaa.id)select * from my1; --下面是递归删除1结点和所有子结点的语句:with my1 as(select * from aaa where id = 1 union all select aaa.* from my1, aaa where my1.id = aaa.pid)delete from aaa where exists (select id from my1 where my1.id = aaa.id)二:
SQLserver2008使用表达式递归查询
--由父项递归下级
with cte(id,parentid,text) as (--父项 select id,parentid,text from treeview where parentid = 450 union all --递归结果集中的下级 select t.id,t.parentid,t.text from treeview as t inner join cte as c on t.parentid = c.id ) select id,parentid,text from cte --由子级递归父项 with cte(id,parentid,text) as (--下级父项 select id,parentid,text from treeview where id = 450 union all --递归结果集中的父项 select t.id,t.parentid,t.text from treeview as t inner join cte as c on t.id = c.parentid ) select id,parentid,text from cte