У меня есть таблица Employee IDs
с соответствующим Manager IDs
, как показано ниже:
Желаемый результат : Столбец старшего менеджера, в котором есть менеджер свертки, который напрямую отчитывается Джону Смиту (EmpID: 1
) или Анне Уайт (EmpID: 2
).
Пример: Том отчитывается перед Джеком, который отчитывается перед Тимом, который отчитывается перед Анной.
Следовательно, старший менеджер Джека Блэка - Тим Смит, 4
.
Том -> Джек -> Тим -> Анна
Я работал над CTE
, но запрос возвращает много дублированных строк. В противном случае CTE
выводит правильные данные.
WITH cte AS
(
SELECT EmpID, FirstName, LastName, EmpID as SeniorManager
FROM Employees
WHERE ManagerID < 3
AND EmpActive = 1
UNION ALL
SELECT emp.EmpID, emp.FirstName, emp.LastName, c.SeniorManager
FROM Employees emp
JOIN cte c ON c.EmpID = emp.ManagerID
WHERE emp.EmpID <> emp.ManagerID
AND emp.EmpActive = 1
)
SELECT * FROM cte
Данные в качестве примера представляют собой упрощенную версию фактических данных, которые хранятся в базе данных компании. Мой главный вопрос: почему CTE возвращает дублированные строки?
Вот пример данных:
CREATE TABLE Employees (
EmpID INT NOT NULL PRIMARY KEY,
FirstName VARCHAR(35) NOT NULL,
LastName VARCHAR(35) NOT NULL,
ManagerID INT NOT NULL);
INSERT INTO Employees
(EmpID, FirstName, LastName, ManagerID)
VALUES
(1, 'John', 'Smith', 2),
(2, 'Anna', 'White', 1),
(3, 'Jack', 'Black', 4),
(4, 'Tim', 'Smith', 2),
(5, 'Jason', 'Black', 3),
(6, 'Tom', 'Black', 3);