Sql server 在层次结构中查找元素

Sql server 在层次结构中查找元素,sql-server,tsql,common-table-expression,hierarchical,Sql Server,Tsql,Common Table Expression,Hierarchical,我正在尝试使用T-SQL的和创建分层查询。例如,我想做的是,直接或间接地找出John是否是Ryan的老板 如何为此编写查询 WITH BossOf AS( SELECT bossId, Id From Employees UNION ALL SELECT b.bossId, e.Id FROM Employees AS e INNER JOIN BossOf b ON b.Id = e.bossId ) SELECT * FROM BossOf WH

我正在尝试使用T-SQL的
创建分层查询。例如,我想做的是,直接或间接地找出John是否是Ryan的老板

如何为此编写查询

WITH BossOf AS(
   SELECT bossId, Id From Employees
       UNION ALL
   SELECT b.bossId, e.Id 
   FROM Employees AS e
   INNER JOIN BossOf b ON b.Id = e.bossId
)
SELECT * FROM BossOf
   WHERE Id = 'Ryan'
作为一个你可以用BossOf做什么的例子

WITH BossOf AS(
   SELECT bossId, Id From Employees
       UNION ALL
   SELECT b.bossId, e.Id 
   FROM Employees AS e
   INNER JOIN BossOf b ON b.Id = e.bossId
)
SELECT * FROM Employees
    WHERE Id IN (SELECT BossId 
                    FROM BossOf
                    Where Id = 'Ryan')
甚至

WITH BossOf AS(
   SELECT bossId, Id From Employees
       UNION ALL
   SELECT b.bossId, e.Id 
   FROM Employees AS e
   INNER JOIN BossOf b ON b.Id = e.bossId
)
SELECT COUNT(*) FROM BossOf
   WHERE Id = 'Ryan'
   AND BossId = 'John'

阅读常用表格表达式(通常缩写为“CTE”)。一旦你掌握了这些,请阅读递归CTE:-)发布更多详细信息、你的表、你想要的结果和你尝试的内容……然而,这个查询返回组织的整个层次结构。如何将树限制为仅Ryan的BOSS?请将BossOf视为SQL视图,在下一次查询后将其丢弃。请注意,在此代码之前可能需要显式分号。非常感谢Aron!!然而,这正是我想要避免的。我的公司的实际数据层次结构非常大,首先检索整个树,然后查找A是否是B的子级看起来非常昂贵??实际上,试试这个查询。SQL server的查询计划器实际上将使其比您预期的效率更高。临时视图(CTE)从未实现过。此外,由于它是内联的,查询计划器将重新安排查询,并将WHERE Id='Ryan'放在最深的嵌套中。实际上,运行此查询的成本低得令人难以置信。