我正在使用 SQL Server 2008 R2 SP1。
我想通过“沿着树向上走”来递归地找到某个组织单位的第一个非空经理。
我有一张包含组织单位“ORG”的表,一张包含每个组织的父级的表。 “ORG”中的单位,我们将该表称为“ORG_PARENTS”,并且包含每个组织单位的经理的一个表,我们将该表称为“ORG_MANAGERS”。
ORG 有一个列 ORG_ID:
ORG_ID
1
2
3
ORG_PARENTS 有两列。
ORG_ID, ORG_PARENT
1, NULL
2, 1
3, 2
MANAGERS 有两列。
ORG_ID, MANAGER
1, John Doe
2, Jane Doe
3, NULL
我正在尝试创建一个递归查询,它将找到某个组织单位的第一个非空经理。
基本上,如果我今天对经理进行 ORG_ID=3 查询,我将得到 NULL。
SELECT MANAGER FROM ORG_MANAGERS WHERE ORG_ID = '3'
我希望查询使用 ORG_PARENTS 表来获取 ORG_ID=3 的父表,在本例中获取“2”,并针对 ORG_ID=2 的 ORG_MANAGERS 表重复查询,并在此示例中返回“Jane Doe”。
如果查询也返回 NULL,我想对 ORG_ID=2 的父级重复该过程,即 ORG_ID=1 等等。
到目前为止,我的 CTE 尝试都失败了,一个例子是这样的:
WITH BOSS (MANAGER, ORG_ID, ORG_PARENT)
AS
( SELECT m.MANAGER, m.ORG_ID, p.ORG_PARENT
FROM dbo.MANAGERS m INNER JOIN
dbo.ORG_PARENTS p ON p.ORG_ID = m.ORG_ID
UNION ALL
SELECT m1.MANAGER, m1.ORG_ID, b.ORG_PARENT
FROM BOSS b
INNER JOIN dbo.MANAGERS m1 ON m1.ORG_ID = b.ORG_PARENT
)
SELECT * FROM BOSS WHERE ORG_ID = 3
它返回:
消息 530,第 16 级,状态 1,第 4 行
声明终止。在语句完成之前,最大递归次数 100 已用完。
MANAGER ORG_ID ORG_PARENT
NULL 3 2