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

SQL层次结构循环/递归查询/自连接,sql,sql-server,recursive-query,Sql,Sql Server,Recursive Query,我已收到一份已批准或未批准的订单列表 我想要的是一个概览表,在同一列中包含所有批准的订单及其子订单。最好在它旁边有一个层次/顺序级别,指示深度 您可以使用如下使用CTE的查询 子订单表非常大,只有3-4个级别处于焦点位置 对于这一变化,您的CTE将是 ; with CTE as ( select OrderNumber, Number = 0, Level = ROW_NUMBER() OVER (ORDER BY (SE

我已收到一份已批准或未批准的订单列表

我想要的是一个概览表,在同一列中包含所有批准的订单及其子订单。最好在它旁边有一个层次/顺序级别,指示深度


您可以使用如下使用CTE的查询

子订单表非常大,只有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
)

我被你期望的等级制度弄糊涂了。我知道在你的例子中ABC是1.0,但是ABC.4、ABC.5、ABC.6不是在同一水平吗?ABC.3是ABC.4的子订单,难道不应该是第二级吗?我在Oracle做了一些事情。。这将是非常相似的这是sql server版本@basodre,你是对的,很可能这个例子有误导性。其目的是在同一列中创建一个从订单到子订单的层次结构。这很好-我几乎达到了我想要的程度:-数字逻辑基于。属于亚目。我们如何将其更改为一个常规的等级-无论其级别如何?最后,我可以限制每个子订单的递归查找的数量吗?例如仅返回订单的最多3个子订单级别?子订单表非常大,只有3-4级处于焦点位置。另外,如果我理解您删除数字逻辑的意思-将上次选择替换为选择订单号,Hierarchy=CONCATLevel,“.”,从CTE订单逐级ASC的子级别,子级别ASC
; 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
)