Я новичок в рекурсивных CTE. Я пытаюсь разработать CTE, который вернет всех сотрудников под каждым именем менеджера. Поэтому у меня есть две таблицы: people_rv
и staff_rv
Как разработать рекурсивный CTE в T-SQL?
Таблица People_rv содержит всех людей, как менеджеров, так и сотрудников. Staff_rv
содержит только информацию о менеджере. Значения персонала Uniqueidentifier хранятся в Staff_rv
. Значения сотрудника Uniqueidentifier хранятся в people_rv
. People_rv
содержит значения имени и фамилии varchar как для менеджеров, так и для сотрудников.
Но когда я запускаю следующий КТР я получаю сообщение об ошибке:
WITH
cteStaff (ClientID, FirstName, LastName, SupervisorID, EmpLevel)
AS
(
SELECT p.people_id, p.first_name, p.last_name, s.supervisor_id,1
FROM people_rv p JOIN staff_rv s on s.people_id = p.people_id
WHERE s.supervisor_id = '95E16819-8C3A-4098-9430-08F0E3B764E1'
UNION ALL
SELECT p2.people_id, p2.first_name, p2.last_name, s2.supervisor_id, r.EmpLevel + 1
FROM people_rv p2 JOIN staff_rv s2 on s2.people_id = p2.people_id
INNER JOIN cteStaff r on s2.staff_id = r.ClientID
)
SELECT
FirstName + ' ' + LastName AS FullName,
EmpLevel,
(SELECT first_name + ' ' + last_name FROM people_rv p join staff_rv s on s.people_id = p.people_id
WHERE s.staff_id = cteStaff.SupervisorID) AS Manager
FROM cteStaff
OPTION (MAXRECURSION 0);
Мой вывод:
Barbara G 1 Melanie K
Dawn P 1 Melanie K
Garrett M 1 Melanie K
Stephanie P 1 Melanie K
Amanda F 1 Melanie K
Amanda T 1 Melanie K
Stephanie G 1 Melanie K
Carlos H 1 Melanie K
Так что не итерацию больше, чем первый уровень. Почему нет? Melanie - самый главный руководитель, но каждый из лиц в самом левом столбце также является руководителем. Таким образом, этот запрос должен также возвращать уровень 2.
Вы уверены, что GUID используется в конечной ноге рекурсивного КТЭ правильно? Первое, о чем я думаю, состоит в том, что рекурсивная часть никогда не заканчивается, и первое, что приходит в голову, заключается в том, что условие завершения не выполняется ... и что GUID кажется по крайней мере вероятной целью ... –
Потенциальная опечатка : в INNER JOIN ваш запрос теперь использует 's2.staff_ID', где, похоже, требуется' s2.supervisor_id'? – Hellion