一个表有主id和父级id,如何查询某已知id下的所有相关的子id
--我想构建一棵树,表里面有主id,和父级id,当父级id是0时就代表在树的顶层,只要根据父子id就可以构建这棵树
--如下表:
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
查询指定节点及其子节点的方法: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 行受影响)*/
[解决办法]
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