SQL Server : CTE going a level back in the where clause

标签 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

    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) 

它受到 Manager 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

任何帮助将不胜感激

最佳答案

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

关于SQL Server : CTE going a level back in the where clause,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13383585/

相关文章:

sql-server - 如何获得SQL Server 2005数据库的独占访问权限来恢复?

sql - 如何计算SQL Server 2012中每行的百分比?

sql-server - 递归 CTE 中的 TSQL GROUP BY

mysql - 在 SQL 注入(inject)中获取数据库名称

javascript - 我如何在 SQLite 中进行高级查询以按标签搜索文件?

sql - 通过一个查询从 3 个表中删除

tsql - 连接具有动态数据集的表

sql - 根据不同表中的键查询更新表

sql - 如何在sql中获取最新年份

sql-server - SQL Server 2012 CTE 查找分层数据的根或顶层父级