取得一个树节点下所有孩子,孙子等的记录的sql语句!

smiletosky 2003-09-20 02:58:10
id name parentid
1 基础数据 0
2 行政区域 1
3 教材中心 1
4 计算机 3
5 项目管理 3
6 软件工程 4
7 项目管理 4
我想取出所有属于3的孩子的记录!
...全文
201 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
junny1017 2003-09-20
  • 打赏
  • 举报
回复
也可以修改一个库结构如添加一个字段,用来存储该条记录的路径信息,便于查询语句的写法
如:
id name parentid parentpath
1 基础数据 0 (0)
2 行政区域 1 (1),(0)
3 教材中心 1 (1),(0)
4 计算机 3 (3),(1),(0)
5 项目管理 3 (3),(1),(0)
6 软件工程 4 (4),(3),(1),(0)
7 项目管理 4 (4),(3),(1),(0)

如果要查询所有3的子孙后代的话:可以用 select * from tablename where parentpath like '%(3)%'
zjcxc 元老 2003-09-20
  • 打赏
  • 举报
回复
测试结果:

id name parentid
----------- ---------- -----------
4 计算机 3
5 项目管理 3
6 软件工程 4
7 项目管理 4

(所影响的行数为 4 行)
zjcxc 元老 2003-09-20
  • 打赏
  • 举报
回复
下面是数据测试:

--创建数据测试环境--表
create table tb(id int identity(1,1),name varchar(10),parentid int)
insert into tb
select '基础数据',0
union all select '行政区域',1
union all select '教材中心',1
union all select '计算机',3
union all select '项目管理',3
union all select '软件工程',4
union all select '项目管理',4
go

--创建辅助查询的自定义函数
create function f_getmergid(@id int)
returns varchar(1000)
as
begin
declare @re varchar(1000),@pid int
set @re=cast(@id as varchar)
select @pid=parentid from tb where id=@id
while @@rowcount>0
select @re=cast(@pid as varchar)+','+@re
,@pid=parentid from tb where id=@pid
return(@re)
end
go

--调用自定义函数实现查询
select * from tb
where dbo.f_getmergid(id) like dbo.f_getmergid(3)+',%'
go

--删除数据测试环境
drop table tb
drop function f_getmergid
zjcxc 元老 2003-09-20
  • 打赏
  • 举报
回复
可以创建一个自定义来协助处理:

--创建辅助查询的自定义函数
create function f_getmergid(@id int)
returns varchar(1000)
as
begin
declare @re varchar(1000),@pid int
set @re=cast(@id as varchar)
select @pid=parentid from 表名 where id=@id
while @@rowcount>0
select @re=cast(@pid as varchar)+','+@re
,@pid=parentid from 表名 where id=@pid
return(@re)
end
go

--调用这个自定义来实现查询:
select * from 表名
where dbo.f_getmergid(id) like dbo.f_getmergid(3)+',%'

--上面的仅显示3的子,孙子,....,如果要显示3及3的子,孙子...,就用:
select * from 表名
where dbo.f_getmergid(id) like dbo.f_getmergid(3)+'%'

txlicenhe 2003-09-20
  • 打赏
  • 举报
回复
如果知道最多只有几层就好写了,比如最多3层:
Select * from tablename where parentid = 3
union all
select * from tablename where parentid in (Select id from tablename where parentid = 3 )
Union all
Select * from tablename where parentid in (select id from tablename where parentid in (Select id from tablename where parentid = 3 ))



smiletosky 2003-09-20
  • 打赏
  • 举报
回复
我要去id为3的所有后代!!
smiletosky 2003-09-20
  • 打赏
  • 举报
回复
select * from tablename where parentid=3
只能取他的儿子,孙子取不了,曾孙等,我要取他所有的后代!
txlicenhe 2003-09-20
  • 打赏
  • 举报
回复
层次关系是怎样定的?
welyngj 2003-09-20
  • 打赏
  • 举报
回复
select * from tablename where parentid=3

34,875

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧