[英]SQL Hierarchy loop / Recursive query / self join
我收到了一份已获批准或未获批准的订单清单。
我想要的是一个概览表,其中包含同一列中的所有“已批准”订单及其子订单。 很高兴在它旁边有一个层次结构/顺序级别,指示深度。
您可以使用如下使用 CTE 的查询
Create table Orders (OrderNumber nvarchar(max), Status nvarchar(max));
insert into Orders Values
('ABC','Approved'),
('DEF','Not Approved'),
('GHI','Approved'),
('JKL','Approved');
Create table OrderHistory (OrderNumber nvarchar(max), SubOrders nvarchar(max));
insert into OrderHistory Values
('ABC','ABC.4'),
('ABC','ABC.5'),
('ABC','ABC.6'),
('ABC.4','ABC.3'),
('ABC.3','ABC.2'),
('ABC.2','ABC.1');
; with CTE as
(
select
OrderNumber,
Number = 0,
Level = ROW_NUMBER() OVER (ORDER BY (SELECT NULL))
from Orders
where Status='approved'
union all
select
OrderNumber = S.SubOrders,
Number = CAST(SUBSTRING(S.SubOrders,CHARINDEX('.',S.SubOrders)+1, LEN(S.SubOrders)-CHARINDEX('.',S.SubOrders)) AS INT),
Level = C.Level
from CTE C JOIN
OrderHistory S
on S.OrderNumber=C.OrderNumber
)
select
OrderNumber,
Hierarchy = CONCAT(Level,'.',Number)
from CTE
Order by Level,CASE WHEN Number =0 THEN 99999 ELSE Number END DESC
SubOrder 表非常大,只关注 3-4 级。
为此将您的 CTE 更改为
; with CTE as
(
select
OrderNumber,
Number = 0,
Level = ROW_NUMBER() OVER (ORDER BY (SELECT NULL)),
SubLevel = 1
from Orders
where Status='approved'
union all
select
OrderNumber = S.SubOrders,
Number = CAST(SUBSTRING(S.SubOrders,CHARINDEX('.',S.SubOrders)+1, LEN(S.SubOrders)-CHARINDEX('.',S.SubOrders)) AS INT),
Level = C.Level,
SubLevel = C.SubLevel +1
from CTE C JOIN
OrderHistory S
on S.OrderNumber=C.OrderNumber
and C.SubLevel<5
)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.