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