如何查找一个父节点下的所有子孙节点的数据?

aelfintiger 2015-07-22 03:43:59
如下表
id uname pid
1 a 0
2 b 0
3 c 1
4 d 3
.
.
.
.



根据根节点a查询下面的所有子节点数据
得到如下:
1 a 0
3 c 1
4 d 3
.
.
.
.
.
.
...全文
1408 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
michael_own 2019-07-03
  • 打赏
  • 举报
回复
好久的帖子了 我也回复一下吧
看评论里没有用start with connect by 的
有两个语句 只是起始的条件不一样
1.select * from table start with id = '当前节点的id' connect by pid = prior id;
这个会包含当前节点和所有的后代节点
2.select * from table start with pid = '当前节点的id' connect by pid = prior id;
这个单纯获取当前节点的所有的后代节点
谦自达 2015-12-19
  • 打赏
  • 举报
回复
这个可以有!
ghlfllz 2015-07-23
  • 打赏
  • 举报
回复
主表结构加一个字段 id uname pid path 1 a 0 1 2 b 0 2 3 c 1 1,3 4 d 3 1,3,4 查的时候直接写 select id,uname,pid from test where ((',' + path + ',') like '%,1,%') order by path
l1314j 2015-07-23
  • 打赏
  • 举报
回复
在设计部门时,会遇到这种问题
我在设计时,也是加入了一个自动计算列 deptmentPath,引用一个递归函数



ALTER FUNCTION [dbo].[getPath]
(
@id uniqueidentifier,
@tempId varchar(4000) =''
)
RETURNS varchar(4000)
AS
BEGIN

declare @str varchar(4000)
declare @pid varchar(50)

select @str = ISNULL(DeptName,'') ,@pid = ParentId, @tempId= ISNULL(@tempId,'')+ ','+ convert(varchar(50),@id) +',' From Department where ID = @id

if exists (select 1 from Department where Id= @pid)
BEGIN
--此判断非常重要,防止进入死循环,即自己为自己的父级
IF(CHARINDEX( ','+ convert(varchar(50),@pid) +',',@tempId) =0)
BEGIN
select @str = dbo.getPath(@pid,@tempId)+'/'+@str
END
END
ELSE
BEGIN
select @str = DeptName From Department where ID = @id
END

return ISNULL(@str,'')

END





结果如图。
这样做的好处是,任意变更父节点的id,其path会自动变化,在查找子部门时,直接使用字符串截取,很方便

仅供参考。
csdn94sb 2015-07-23
  • 打赏
  • 举报
回复

DECLARE @t_TB TABLE ([id] tinyint,[uname] NVARCHAR(10),[pid] tinyint);
INSERT INTO @t_TB VALUES 
('1','a',0 ),
('2','b',0 ),
('3','c',1 ),
('4','d',3 );
;with cte as(
select * from @t_TB where id=1 
union all select a.* from @t_TB a join cte on a.pid=cte.id
) select * from cte

/*
id	uname	pid
1	a	0
3	c	1
4	d	3
*/



卖水果的net 版主 2015-07-22
  • 打赏
  • 举报
回复
-- 大概这样子,没有数据,你测试一下。
with mt as 
(
select t.id , t.uname , t.pid from test t where id = 'x'  -- 父节点
union all
select t.id , t.uname , t.pid from test t , mt where t.pid = mt.id
)
select * from mt
Cherise_huang 2015-07-22
  • 打赏
  • 举报
回复

SELECT ID,
       uname,
       pid 
FROM test WHERE uname = 'a' AND pid<>'0'

34,590

社区成员

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

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