sql根据子节点查出所有的父节点的
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了sql根据子节点查出所有的父节点的相关的知识,希望对你有一定的参考价值。
select *
from (select *
from gqgx_company_level ln
where ln.company_level_name like '%EMS%') t2
这里面能查出10条不同层的数据,有的是1层,有的是2层,有的是5层,现在怎么查出这些节点的所有父节点的信息呢(gqgx_company_level中有id,name,p_id)
解决了再加200分
父节点查询子节点
create function GetChildID(@ParentID int)
returns @t table(ID int)
as
begin
insert into @t select id from table where parent_id = @ParentID
while @@rowcount<>0
begin
insert into @t select a.id from table as a
inner join @t as b
on a.parent_id = b.ID
and not exists(select 1 from @t where ID=a.ID)
end
return
end
go
子节点查询父节点
create function GetParentID(@ChildID int)
returns @t table(PID int)
as
begin
insert into @t select parent_id from table where ID=@ChildID
while @@rowcount<>0
begin
insert into @t select a.parent_id from table as a
inner join @t as b
on a.ID=b.PID
and not exists(select 1 from @t where PID=a.parent_id)
end
return
end
go追问
然后呢,创建了函数了之后该怎么和我那个条件连接起来? 还有这个函数里面的表和字段需要改动吗?
追答如创建了函数,你要查12节点的父节点,可以用 select * from GetParentID('12') 这样,改动语句要先改: insert into @t select parent_id from table where ID=@ChildID 这里的table是表名,id是子节点字段名,下面的语句跟着修改
追问那我怎么循环放入id到这个函数 select * from GetParentID('n')呢?
追答函数会把n所有的父节点都搜出来的,你要不把表结构贴出来吧
追问提问中我已经贴了表,company_level_id(节点id),company_level_name(节点名称),p_company_level_id(父节点)。还有function不能运行是错的呢,我用的是oracle不是my sql
追答oracle?这个是mssql的
追问oracle的。。。。。。那你有oracle的写法么
追答oracle应该没有while @@rowcount0 这种写法的
追问后来改动了之后就是这句报错,现在正在找其他的方法,我准备用count统计
追答试试吧,mssql的就可以帮你
参考技术A 一个子节点有多个父节点? 参考技术B 写个递归查询不就可以了吗追问我现在就是在捉摸这个递归查询啊,不怎么好写,能指导下吗?
JS根据子节点递归获取所有父节点的集合
参考技术A //传入参数:需要遍历的对象,需要匹配的id,获取所有的父级节点的Idfunction findIdList(data2, id, children = 'children', level = 0)
var arrRes = [];
let obj =
id: 0,
[children]: data2
let rev = (data, id, level) =>
if (!data || !data[children] || !data[children].length)
return;
for (var i = 0; i < data[children].length; i++)
let item = data[children][i];
if (item.id == id)
// 将匹配到的结果保存到数组
arrRes.unshift( level, activeId: item.id );
// 递归它的父级
rev(obj, data.id, 0);
break;
else if (item[children] && item[children].length > 0)
//如果有子集,则把子集作为参数重新执行本方法
rev(item, id, level + 1);
;
rev(obj, id, level);
return arrRes;
let list = [
id: 1, children: [
id: 11, children: [id: 12]
],
id: 2, children: [id:21, children: [id: 31]]
]
let b = findIdList(list, 21)
console.log(b) // [ level: 0, activeId: 2 , level: 1, activeId: 21 ]
以上是关于sql根据子节点查出所有的父节点的的主要内容,如果未能解决你的问题,请参考以下文章