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,获取所有的父级节点的Id

        function 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根据子节点查出所有的父节点的的主要内容,如果未能解决你的问题,请参考以下文章

SQL (根据子节点查询父节点信息)

SQL通过父节点获取所有子节点

JS根据子节点递归获取所有父节点的集合

mysql如何根据很多子节点查询出父节点,只要一条路径上的

Delphi TreeView 选择父节点,选择所有子节点

SQL语句查询出父节点下的所有子节点