SQL Server:CTE在where子句中返回一级

SQL Server:CTE在where子句中返回一级,sql,sql-server,common-table-expression,recursive-query,Sql,Sql Server,Common Table Expression,Recursive Query,我想对递归查询设置一个限制。但我不想丢失限制递归的最后一个条目 现在查询如下所示: 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

我想对递归查询设置一个限制。但我不想丢失限制递归的最后一个条目

现在查询如下所示:

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) 
EmployeeID; FirstName; LastName; ManagerID; level
1           Ken        Sánchez   NULL       0
它受到经理Welcker的限制,结果如下:

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) 
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

非常感谢您提供的任何帮助

您能否将这一行更改为
b.LastName='Welcker'

是否执行'OPTION(MAXRECURSION 25)'更改'level+1'的行为?那太疯狂了!另外还有10名员工,其中一些员工可以在一年内更换。基本上,当welcker出现时,它应该停止深入结构,但仍然显示条目。不知道我是否说得很清楚:我回到办公室后,我会试试这个:)看起来很简单:)如果我这样做,并使用与cte中较低级别不同的姓氏。我刚得到0级员工!我想要的是一个像Maxrecursion这样的限制,但是有一个值。与选项类似(在“rndLastname”处停止),然后CTE在此路径上停止。例如,我有一个名为Sanchez的用户,他是buissnes的所有者和4个部门的负责人。我想看到的是3位部门负责人,包括他们的员工,但不是第四位经理的员工。但是经理需要被展示出来!这个例子在这种情况下没有多大意义,但我想很清楚我想做什么。在这个例子中,我失去了“Welcker”级别以下的所有条目。甚至他们也没有“韦尔克”担任经理。但我仍然需要这些。只有“韦尔克”担任经理的人才应该离开。但是我们越来越接近:)它现在正在与您之前的一个版本一起工作,非常感谢。我仍然不知道为什么它现在起作用。我使用WHERE MyCTE.LastName!='江泽民"没有水平的东西!!我仍然不知道它为什么有效,但它确实有效!!!!您错过了原始查询的递归性质。我认为你的解决方案不会走完整的层次结构。是的,我认为我没有击中目标。我喜欢这个问题。希望看到更多的答案。
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