我想为递归查询设置限制。但我不想失去限制递归的最后一个条目。
现在查询如下所示:
WITH MyCTE (EmployeeID, FirstName, LastName, ManagerID, level, SPECIAL)
AS (
SELECT a.EmployeeID, a.FirstName, a.LastName, a.ManagerID, 0 as Level
FROM MyEmployees as a
WHERE ManagerID IS NULL
UNION ALL
SELECT b.EmployeeID, b.FirstName, b.LastName, b.ManagerID, level + 1
FROM MyEmployees as b
INNER JOIN MyCTE ON b.ManagerID = MyCTE.EmployeeID
WHERE b.ManagerID IS NOT NULL and b.LastName != 'Welcker'
)
SELECT *
FROM MyCTE
OPTION (MAXRECURSION 25)
它受到经理Welcker的限制,结果如下:
EmployeeID; FirstName; LastName; ManagerID; level
1 Ken Sánchez NULL 0
我想要的是包括员工'Welcker'。问题是我只有我在列表中需要的最后一个人的名字。命令结构中有一些条目,但我不知道它们,我不想看到它们。
以下是我想象查询结果的示例。
EmployeeID FirstName LastName ManagerID level
1 Ken Sánchez NULL 0
273 Brian Welcker 1 1
非常感谢任何帮助
答案 0 :(得分:2)
WITH MyCTE (EmployeeID, FirstName, LastName, ManagerID, level, NotMatched)
AS (
SELECT a.EmployeeID, a.FirstName, a.LastName, a.ManagerID, 0 as Level, 0 AS NotMatched
FROM MyEmployees as a
WHERE ManagerID IS NULL
UNION ALL
SELECT b.EmployeeID, b.FirstName, b.LastName, b.ManagerID, level + 1,
CASE WHEN (MyCTE.LastName = 'Welcker' AND MyCTE.level = 1) THEN 1 ELSE MyCTE.NotMatched END
FROM MyEmployees as b
INNER JOIN MyCTE ON b.ManagerID = MyCTE.EmployeeID
)
SELECT *
FROM MyCTE
WHERE NotMatched != 1
答案 1 :(得分:0)
您可以将这一行更改为b.LastName = 'Welcker'
吗?
答案 2 :(得分:0)
select distinct
t.b_eid as empId,
t.b_name as name,
case t.b_mid when 0 then null else t.b_mid end as managerId
--convert(varchar,t.b_eid) + ', ' +
--t.b_name + ', ' +
--case t.b_mid when '0' then 'null' else convert(varchar,t.b_mid) end
--as bvals
from(
select
coalesce(a.mid, 0) as a_mid,
a.eid as a_eid,
a.name as a_name,
coalesce(b.mid, 0) as b_mid,
b.eid as b_eid,
b.name as b_name
from
(values(null,1,'adam'),(null,2,'barb'),(201,3,'chris')) as a(mid,eid,name) cross join
(values(null,1,'adam'),(null,2,'barb'),(201,3,'chris')) as b(mid,eid,name)
) as t
where (t.a_mid = t.b_eid or t.a_mid = 0 or t.b_mid = 0) and t.a_name != 'chris'