我的Server 2008中有这样一个表。
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查询中可能吗?
预期结果应该如下所示:
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. --发布于 2015-11-18 14:44:35
您可以使用Recursive CTE:
;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
发布于 2015-11-18 13:03:35
基于你有最多5个等级的事实,这应该是可行的。
如果您只选择了第一个级别上的值,然后使用内部联接降低级别,那么您应该可以得到预期的结果:
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.Levelhttps://stackoverflow.com/questions/33776959
复制相似问题