我正在创建一个 SQL Server 2008 查询,该查询将输出公司中的员工列表以及他们所在的团队以及一个附加列。
组织树示例:
Level 0: CEO
Level 1: A, B, and C
Level 2:
For A:1,2,3
For B:4,5,6
For C:7,8,9
在我的结果集中,我应该看到三列——名称、级别(树的)和团队。对于 1,2 和 3,我会将“A”视为他们的团队,将 2 视为级别。对于 4,5 和 6,'B' 和 2 用于级别,依此类推。
我正在使用递归查询来导航树(那里没有问题),但是由于我需要将团队名称“携带”到查询中(如果有 8 级 - 它仍然应该显示第 1 级的人他们报告),我正在这样做:
(...)
UNION ALL
-- Recursive Member Definition
-- in here level increments one each time, and the team should output the child
-- of the top manager
SELECT A.treenodeid, A.parentnodeid, A.email, LEVEL+1, team =
CASE LEVEL
When 1 then SET @salead = A.Email
Else @salead
END
FROM XX as A
INNER JOIN TeamsTable as B on A.parentnodeid = b.treenodeID
由于我试图使用 CASE 来检查级别是否为 1(将团队名称更新为团队负责人的电子邮件名称),SQL 一直说在这种情况下我有“ SET 附近的语法不正确”。
是否可以在 CASE 中进行此类分配?我环顾四周,没有发现这是否适用于我的递归案例。
这是所有查询(假设根是“JohnSmith”):
WITH TeamsTable (treenodeid, parentnodeid, email, Level, team)
AS
(
-- Anchor - Level starts with 0, and the team is empty for the top manager
SELECT treenodeid,parentnodeid,email,0,''
FROM XX WHERE email = 'JohnSmith'
UNION ALL
-- Recursive Member Definition - in here level increments one each time, and the team should output the child of the top manager
SELECT
A.treenodeid, A.parentnodeid, A.email, LEVEL+1, team =
CASE LEVEL
When 1 then SET @salead = A.Email
Else @salead
END
FROM XX as A
INNER JOIN TeamsTable as B on A.parentnodeid = b.treenodeID
)
-- Statement that executes the CTE
SELECT *
FROM TeamsTable
非常感谢,伙计们!