Логическая обработка рекурсивного CTE - PullRequest
0 голосов
/ 27 января 2019

Я не понимаю, почему якорь не вызывается, когда рекурсивный член вызывает cte.

Почему вместо этого идет последняя запись (?) В рекурсивной части?

WITH Managers AS 
( 
--initialization 
SELECT EmployeeID, LastName, ReportsTo  
FROM Employees 
WHERE ReportsTo IS NULL 
UNION ALL 
--recursive execution 
SELECT e.employeeID,e.LastName, e.ReportsTo 
FROM Employees e INNER JOIN Managers m  
ON e.ReportsTo = m.employeeID 
) 
SELECT * FROM Managers

1 Ответ

0 голосов
/ 27 января 2019

Это известный пример базы данных Microsoft Northwind (неизменный с 1997 года).Таблица Emploeees демонстрирует иерархические данные и использование рекурсивного CTE (недоступно в 1997 году) для доступа к нему.

Для лучшего понимания / тестирования / целей обучения добавьте дополнительный столбец

WITH Managers AS 
( 
  --initialization 
  SELECT EmployeeID, LastName, ReportsTo, /*extra column*/ 0 [level]  
  FROM Employees 
  WHERE ReportsTo IS NULL 

  UNION ALL 

  --recursive execution 
  SELECT e.employeeID,e.LastName, e.ReportsTo, [level]+1 
  FROM Employees e 
  INNER JOIN Managers m ON e.ReportsTo = m.employeeID 
) 
SELECT * FROM Managers

Это набор результатов.

EmployeeID  LastName             ReportsTo   level
----------- -------------------- ----------- -----------
2           Fuller               NULL        0 --anchor call
--now 'Managers' CTE is the anchor (level 0)
1           Davolio              2           1
3           Leverling            2           1
4           Peacock              2           1
5           Buchanan             2           1
8           Callahan             2           1
--now 'Managers' CTE is resultset level 1
6           Suyama               5           2
7           King                 5           2
9           Dodsworth            5           2

Итак, якорь выполняется всегда, рекурсивная часть выполняется если якорь возвращает строки.

...