2
이 테이블을 감안할 때
...SQL Server 재귀 CTE -이 동작이 필요한 이유는 무엇입니까?
CREATE TABLE tblEmployees (
EmployeeID SMALLINT,
ReportsTo SMALLINT,
IsBigBoss BIT);
CREATE TABLE tblTargetEmployees (
EmployeeID SMALLINT);
INSERT INTO tblEmployees VALUES
(1,NULL,NULL),
(2,1,1),
(3,1,1),
(4,1,1),
(5,1,1),
(6,2,0),
(7,6,0),
(8,6,0),
(9,3,0),
(10,4,0),
(11,10,0),
(12,10,0),
(13,5,0),
(14,2,0),
(15,10,0);
INSERT INTO tblTargetEmployees VALUES
(8),
(9),
(10),
(11),
(12),
(14);
그리고이 쿼리 ...
WITH cte AS (
SELECT e.EmployeeID, BigBossID=e.EmployeeID, e.ReportsTo
FROM tblEmployees e
WHERE e.IsBigBoss=1
UNION all
SELECT e.EmployeeID, cte.BigBossID, e.ReportsTo
FROM tblEmployees e
JOIN cte ON e.ReportsTo=cte.EmployeeID
)
SELECT *
FROM cte
WHERE EXISTS (SELECT * FROM tblTargetEmployees te WHERE te.EmployeeID=cte.EmployeeID)
ORDER by EmployeeID
는 내가 예상 한 결과를 얻을 수 있습니다. 목표 테이블에있는 6 명의 직원 모두가 반환됩니다. 그러나 대신 필터를 cte로 옮기면 직원 (# 8)이 삭제됩니다. 나는 CTE에 필터를 이동할 때 내 여분의 "빅 보스"행을 건너 왜
WITH cte AS (
SELECT e.EmployeeID, BigBossID=e.EmployeeID, e.ReportsTo
FROM tblEmployees e
WHERE e.IsBigBoss=1
UNION all
SELECT e.EmployeeID, cte.BigBossID, e.ReportsTo
FROM tblEmployees e
JOIN cte ON e.ReportsTo=cte.EmployeeID
WHERE EXISTS (SELECT * FROM tblTargetEmployees te WHERE te.EmployeeID=e.EmployeeID)
)
SELECT *
FROM cte
ORDER by EmployeeID
는 지금, 나는 이해하지만 나는 직원 ID (8)가 필터링됩니다 왜 주위에 내 머리를 포장 힘든 시간을 보내고 있습니다.
이 동작에 대한 내 간단한 마음을 감싸는 데 도움이되는 모든 도움을 주시면 감사하겠습니다.
원하는 볼 수 있습니다 ..... 찾을 수 기다리고 있습니다 필터링 된 직원? – usr
D' oh! 그게 전부 야. 고맙습니다!! –