首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >对分层数据进行分组和排序的查询

对分层数据进行分组和排序的查询
EN

Stack Overflow用户
提问于 2015-11-18 10:02:06
回答 2查看 1.4K关注 0票数 1

我的Server 2008中有这样一个表。

代码语言:javascript
运行
复制
ID     ParentID    Level     Code    Name           Description
1      1           1         EXP     Expenses       --
2      1           2         PEXP    Project Exp    --
3      1           2         IEXP    Indirect Exp.  --
4      4           1         INC     Incomes        --
5      1           2         MEXP    Misc. Exp.     --
6      2           3         MCOST   Material Cost  --
7      4           2         IINC    Indirect Inc.  --
8      6           4         TCOS    Tiles Cost    --

我需要一个按层次顺序选择所有行的查询。(材料成本项下的瓷砖成本、工程费用项下的材料成本、费用项下的项目费用等),最多可分为5级。)表中有2000行。)

这在SQL查询中可能吗?

预期结果应该如下所示:

代码语言:javascript
运行
复制
ID     ParentID    Level     Code    Name           Description
1      1           1         EXP     Expenses       --
3      1           2         IEXP    Indirect Exp.  --
5      1           2         MEXP    Misc. Exp.     --
2      1           2         PEXP    Project Exp    --
6      2           3         MCOST   Material Cost  --
8      6           4         TCOS    Tiles Cost    --
4      4           1         INC     Incomes        --
7      4           2         IINC    Indirect Inc.  --
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-11-18 14:44:35

您可以使用Recursive CTE

代码语言:javascript
运行
复制
;WITH CTE_Tree AS (
   -- Anchor member: get all parent nodes, initialize order_key
   SELECT ID, ParentID, Level, Code, Name, 
          CAST(ID AS VARCHAR(MAX)) AS order_key
   FROM mytable
   WHERE Level = 1

   UNION ALL

   -- Recursive member: get child node of previous node and update
   -- order _key of branch
   SELECT t1.ID, t1.ParentID, t1.Level, t1.Code, t1.Name,
          order_key = t2.order_key + '.' + CAST(t1.Level AS VARCHAR(MAX))
   FROM mytable AS t1
   INNER JOIN CTE_Tree AS t2 ON t1.ParentID = t2.ID AND t1.Level > t2.Level
)
SELECT *
FROM CTE_Tree
ORDER BY order_key,Code

使用CTE来递归地计算一个订单键。订单键的第一个数字是父节点的ID。这是因为我们希望第一个父级分支的所有节点都排序在下一个父节点的分支节点之上。

第二,第三,等等,数字仅仅是节点的级别。这样,第2级节点就会精确地排在父节点之后,第3级节点紧随其后,以此类推。

Demo here

票数 1
EN

Stack Overflow用户

发布于 2015-11-18 13:03:35

基于你有最多5个等级的事实,这应该是可行的。

如果您只选择了第一个级别上的值,然后使用内部联接降低级别,那么您应该可以得到预期的结果:

代码语言:javascript
运行
复制
SELECT MyTable5.* FROM MyTable as MyTable1 
  INNER JOIN MyTable AS MyTable2 ON MyTable2.ParentId = MyTable1.Id
  INNER JOIN MyTable AS MyTable3 ON MyTable3.ParentId = MyTable2.Id
  INNER JOIN MyTable AS MyTable4 ON MyTable4.ParentId = MyTable3.Id
  INNER JOIN MyTable AS MyTable5 ON MyTable5.ParentId = MyTable4.Id
WHERE MyTable1.Level = 1
ORDER BY MyTable1.Id, MyTable5.Level
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33776959

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档