首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

一个表有主id和父级id,怎么查询某已知id上的所有相关的子id

2012-09-02 
一个表有主id和父级id,如何查询某已知id下的所有相关的子id--我想构建一棵树,表里面有主id,和父级id,当父

一个表有主id和父级id,如何查询某已知id下的所有相关的子id
--我想构建一棵树,表里面有主id,和父级id,当父级id是0时就代表在树的顶层,只要根据父子id就可以构建这棵树
--如下表:

SQL code
create table treeItem(    [ID] int IDENTITY(1,1) PRIMARY KEY ,    [ParaID] int NOT NULL ,    [名称] nvarchar(128)  NOT NULL ,) insert into treeItem([ParaID],[名称]) values(0,'1') --1insert into treeItem([ParaID],[名称]) values(1,'1.1') --2insert into treeItem([ParaID],[名称]) values(2,'1.1.1') --3insert into treeItem([ParaID],[名称]) values(2,'1.1.2') --4insert into treeItem([ParaID],[名称]) values(1,'1.2') --5insert into treeItem([ParaID],[名称]) values(5,'1.2.1') --6insert into treeItem([ParaID],[名称]) values(5,'1.2.2') --7insert into treeItem([ParaID],[名称]) values(0,'2') --8insert into treeItem([ParaID],[名称]) values(8,'2.2') --9insert into treeItem([ParaID],[名称]) values(9,'2.2.1') --10insert into treeItem([ParaID],[名称]) values(9,'2.2.2') --11



--这样构建了一个如下所示的树

1
|-1.1
|-1.1.1
|-1.1.2
|-1.2
|-1.2.1
|-1.2.2
2
|-2.2
|-2.2.1
|-2.2.2

--现在我想当知道“1”的id找出它所有的子id,如“1”的id为1,那么他的直属子id有2和5,2和5下还有子id,3、4和6、7,我想知道的是怎么把它们找出来?
--如找id为1的所有字id,结果是2,3,4,5,6,7

[解决办法]
转发大乌龟代码:
SQL code
查询指定节点及其子节点的方法:create table tb(id varchar(3) , pid varchar(3) , name nvarchar(10))insert into tb values('001' , null  , N'广东省')insert into tb values('002' , '001' , N'广州市')insert into tb values('003' , '001' , N'深圳市')insert into tb values('004' , '002' , N'天河区')insert into tb values('005' , '003' , N'罗湖区')insert into tb values('006' , '003' , N'福田区')insert into tb values('007' , '003' , N'宝安区')insert into tb values('008' , '007' , N'西乡镇')insert into tb values('009' , '007' , N'龙华镇')insert into tb values('010' , '007' , N'松岗镇')goDECLARE @ID VARCHAR(3)--查询ID = '001'的所有子节点SET @ID = '001';WITH T AS T(  SELECT ID , PID , NAME   FROM TB   WHERE ID = @ID  –查询根节点  UNION ALL  SELECT A.ID , A.PID , A.NAME   FROM TB AS A JOIN T AS B ON A.PID = B.ID  --递归查询下级节点)SELECT * FROM T ORDER BY ID/*ID   PID  NAME---- ---- ----------001  NULL 广东省002  001  广州市003  001  深圳市004  002  天河区005  003  罗湖区006  003  福田区007  003  宝安区008  007  西乡镇009  007  龙华镇010  007  松岗镇(10 行受影响)*/
[解决办法]
SQL code
declare @t table(fid int)insert @t select 1 --1是父亲id;while 1=1  begin   insert @t select id from treeitem where paraid in(select fid from @t) and id not in(select fid from @t)   if @@rowcount=0     break  endselect * from @t where fid<>1 order by fid  --1为父亲id;--结果:父id为1,子id为下面;fid234567 

热点排行