рекурсивный CTE - ограниченное количество строк - PullRequest
1 голос
/ 18 октября 2010

Я пытаюсь создать запрос к очень простой таблице (организации)

У меня есть столбцы

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,но я не знаком.Так что оцените помощь.

1 Ответ

2 голосов
/ 18 октября 2010
;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'
...