希望在SQL中按(父级>子级)顺序显示组织单元的层次结构

希望在SQL中按(父级>子级)顺序显示组织单元的层次结构,sql,sql-server,hierarchy,Sql,Sql Server,Hierarchy,我们正在运行下面的查询,以便在表的层次结构旁边输出一个ID。 希望将值从树中的最高级别显示到最低级别,但目前尚未出现这种情况。 e、 我们想要的是父级>子级,而不是子级>父级 是否可以修改以下查询以实现此目的? 我们的表结构是id、name、parent\u id,根的parent\u id=null with parents as ( select ID, parent_ID, name from tblorgunit where parent_I

我们正在运行下面的查询,以便在表的层次结构旁边输出一个ID。 希望将值从树中的最高级别显示到最低级别,但目前尚未出现这种情况。 e、 我们想要的是父级>子级,而不是子级>父级 是否可以修改以下查询以实现此目的? 我们的表结构是id、name、parent\u id,根的parent\u id=null

with parents as     
(     
  select ID, parent_ID, name    
  from tblorgunit   
  where parent_ID is not null   
  union all   
  select p.ID,  tblorgunit.parent_ID, tblorgunit.name   
  from parents p   
    inner join tblorgunit on p.parent_ID = tblorgunit.ID    
      and tblorgunit.parent_ID is not null   
      and tblorgunit.ID <> tblorgunit.parent_ID   
)   
select id, name   
  , parents = '(' + stuff   
    (  
      (  
        select ', ' + p.name  
        from parents p   
        where tblorgunit.ID = p.ID  
        for xml path('')  
      ), 1, 2, ''  
    ) + ')'   
from tblorgunit

如果我对你的问题理解正确,但我不确定我是否理解,我认为这可能是解决方案

with parents as     
(     
  select tblorgunit.ID,  tblorgunit.parent_ID, tblorgunit.name   
  from parents p   
    inner join tblorgunit on p.parent_ID = tblorgunit.ID    
      and tblorgunit.parent_ID is not null   
      and tblorgunit.ID <> tblorgunit.parent_ID   
  union all   
  select ID, parent_ID, name    
  from tblorgunit   
  where parent_ID is not null   
)   
select id, name   
  , parents = '(' + stuff   
    (  
      (  
        select ', ' + p.name  
        from parents p   
        where tblorgunit.ID = p.ID
        and tblorgunit.parent_ID = p.Parent_ID
        for xml path('')  
      ), 1, 2, ''  
    ) + ')'   
from tblorgunit
我正在尝试将您的SQL转换为适合我的示例,如果有任何错误,请原谅我

这将产生与以下类似的输出: 1组织单元1父组织单元1,组织单元1 2组织单元2父组织单元1,组织单元2 3组织单元3父母组织单元2,组织单元3


这就是你想要的吗?如果没有,请提供您正在寻找的输出示例。

给您。。。简言之,您试图对外部查询执行递归,而您想要对子区域中的内部查询执行递归

;WITH parents
AS
(
  SELECT parent.ID, parent.parent_Id, parent.name
  FROM tblorgunit parent
  WHERE parent.parent_id IS NULL
  UNION ALL
  SELECT child.ID, child.parent_Id, CONVERT(VARCHAR(100), p.name + ' > ' + child.name)
  FROM tblOrgUnit child
  INNER JOIN parents p ON child.parent_Id = p.ID
  WHERE child.parent_id IS NOT NULL  
)
SELECT * FROM parents
有关使用CONVERT的原因的讨论,请查看


和。

添加了基于缺少的递归关键字和非标准列别名的sql server标记,使用=谢谢。编辑了原文,更详细地解释了我们的目标。也尝试了建议的代码,但出现了错误。啊,是的,我误解了你的问题。在这个答案中,我假设了两个物理表,一个称为tblorgunit,另一个称为parents。但我从您的更新中看到,您有一个递归调用的表。我会查看你的sqlfiddle链接,看看我能做些什么…非常感谢。这正是我想要的。
;WITH parents
AS
(
  SELECT parent.ID, parent.parent_Id, parent.name
  FROM tblorgunit parent
  WHERE parent.parent_id IS NULL
  UNION ALL
  SELECT child.ID, child.parent_Id, CONVERT(VARCHAR(100), p.name + ' > ' + child.name)
  FROM tblOrgUnit child
  INNER JOIN parents p ON child.parent_Id = p.ID
  WHERE child.parent_id IS NOT NULL  
)
SELECT * FROM parents