繁体   English   中英

SQL 层次结构循环/递归查询/自联接

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM