Ver:
- SQL Server - Exemplo simples de um CTE recursivo
- MSDN:consultas recursivas usando expressão de tabela comum
- CTE recursiva do SQL Server (isso parece exatamente com o que você está trabalhando!)
Atualização:
Um CTE recursivo adequado consiste basicamente em três coisas:
-
uma âncoraSELECT
começar com; que pode selecionar, por exemplo, os funcionários de nível raiz (onde oReports_To
é NULL), ou pode selecionar qualquer funcionário arbitrário que você definir, por exemplo, por um parâmetro
-
aUNION ALL
-
um recursivoSELECT
instrução que seleciona da mesma tabela, normalmente auto-referenciada, e une-se ao CTE recursivo que está sendo construído no momento
Isso lhe dá a capacidade de construir recursivamente um conjunto de resultados que você pode selecionar.
Se você olhar para o
Northwind
banco de dados de exemplo, ele tem uma tabela chamada Employees
que é auto-referenciado:Employees.ReportsTo --> Employees.EmployeeID
define quem se reporta a quem. Seu CTE ficaria assim:
;WITH RecursiveCTE AS
(
-- anchor query; get the CEO
SELECT EmployeeID, FirstName, LastName, Title, 1 AS 'Level', ReportsTo
FROM dbo.Employees
WHERE ReportsTo IS NULL
UNION ALL
-- recursive part; select next Employees that have ReportsTo -> cte.EmployeeID
SELECT
e.EmployeeID, e.FirstName, e.LastName, e.Title,
cte.Level + 1 AS 'Level', e.ReportsTo
FROM
dbo.Employees e
INNER JOIN
RecursiveCTE cte ON e.ReportsTo = cte.EmployeeID
)
SELECT *
FROM RecursiveCTE
ORDER BY Level, LastName
Não sei se você pode traduzir sua amostra para um CTE recursivo adequado - mas essa é basicamente a essência:consulta âncora, UNION ALL, consulta recursiva