none
在树形结构表中,已知若干个节点的id,如何用一条select语句查询这些id关联的节点行以及这些节点的所有下级节点 RRS feed

  • 问题


  • 如上图,是一个枚举路径形式的树形结构表(之前例子写错,修改了)

    例如,已知节点1和节点5的id(通过子查询获得或者in查询),不用游标的情况下,如何使用一条select语句获得节点1和节点5的所有下级节点的行(1,2,3,5,6)?



    • 已编辑 Trian555 2018年11月7日 3:03
    2018年11月6日 8:43

答案

  • 如果你的 PATH 是完整的(最后一行的那种),那么可以简单地从 PATH 中获取子,否则要用递归

    SELECT * FROM tb WHERE id in(1,5)
     UNION ALL
     SELECT * FROm tb c
     WHERE EXISTS(
    	SELECT * FROM tb p WHERE P.id in(1,5)
    		AND CHARINDEX('/' + RTRIM(P.id)+'/', C.path + '/') > 0
    	)

    2018年11月7日 1:01

全部回复

  • 这个结构有点怪

    6 是5的子结点吧?你的PATH写的是 /4/5,这个标准和前面的不一样,在前面 3 是2的子吧?2又是1的子,按照后面的PATH写法,应该是/1/2


    2018年11月7日 0:57
  • 如果你的 PATH 是完整的(最后一行的那种),那么可以简单地从 PATH 中获取子,否则要用递归

    SELECT * FROM tb WHERE id in(1,5)
     UNION ALL
     SELECT * FROm tb c
     WHERE EXISTS(
    	SELECT * FROM tb p WHERE P.id in(1,5)
    		AND CHARINDEX('/' + RTRIM(P.id)+'/', C.path + '/') > 0
    	)

    2018年11月7日 1:01
  • Hi Trian555,

    如果只是记录了上一层的path,可以用递归:

    with temp 
    as
    (
    	select id, replace(path,'/','') as parent_id 
    	from dbo.tree_path 
    	where replace(path,'/','') = 1 or replace(path,'/','') = 5
    	union all 
    	select a.id, replace(a.path,'/','') as par_id 
    	from dbo.tree_path as a
    	inner join temp on replace(a.path,'/','') = temp.id
    )
    select id from temp
    union all
    select 1
    union all
    select 5

    Best Regards,

    Teige


    MSDN Community Support
    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.


    2018年11月7日 2:57
    版主