【问题标题】:recursive CTE - limited numbers of rows递归 CTE - 行数有限
【发布时间】:2025-11-30 05:50:02
【问题描述】:

我正在尝试在一个非常简单的表(组织)上创建查询

我有专栏

Organisation, Manager, Superior_Organisation
CEO
Leadership Team, David, CEO 
Production Management, Alex, Leadership Team
Production Site 1, Francoise, Production Management
Production Site 2, Steve, Production Management
Production Site 1 Maintenance, Alan, Production Site 1

....

由于级别不同,我不知道如何创建一个查询,从一个特定级别开始向我提供所有上级组织

我试过这段代码

declare @i int
select @i = 0
-- keep going until no more rows added
while @@rowcount > 0
begin
select @i = @i + 1
-- Get all children of previous level
SELECT     organisations.Organisation, organisations.Manager,  
organisations.Superior_Organisation
FROM         organisations 
end

但是通过这个查询,我得到了所有信息,但我不知道如何只查询上级组织,例如用于生产现场 1 维护。 (可以是 1 个或最多 5 个)

一种方法可能是在桌子上加入,但我认为,这远非高效。

我见过一些递归 CTE 查询,但我并不熟悉。非常感谢帮助。

【问题讨论】:

    标签: sql parent children recursive-query


    【解决方案1】:
    ;WITH organisations AS
    (
    SELECT 'CEO' AS Organisation, cast(NULL as varchar(50)) AS Manager, cast(NULL as varchar(50)) AS Superior_Organisation UNION ALL
    SELECT 'Leadership Team', 'David', 'CEO'  UNION ALL
    SELECT 'Production Management', 'Alex', 'Leadership Team' UNION ALL
    SELECT 'Production Site 1', 'Francoise', 'Production Management' UNION ALL
    SELECT 'Production Site 2', 'Steve', 'Production Management' UNION ALL
    SELECT 'Production Site 1 Maintenance', 'Alan', 'Production Site 1'
    ),
    cte As (
    SELECT Organisation, Manager, Superior_Organisation
    FROM         organisations 
    WHERE organisations.Organisation = 'Production Site 1 Maintenance'
    UNION ALL
    SELECT o.Organisation, o.Manager, o.Superior_Organisation
    FROM         organisations o
    JOIN cte ON cte.Superior_Organisation = o.Organisation
    )
    SELECT Organisation, Manager, Superior_Organisation
    FROM cte
    WHERE Organisation <> 'Production Site 1 Maintenance'
    

    【讨论】:

    • 这太棒了,速度太快了!我测试过,它确实有效。感谢 1000 次马丁