【问题标题】:Find element in hierarchy在层次结构中查找元素
【发布时间】:2013-01-21 23:59:20
【问题描述】:

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

如何为此编写查询?

【问题讨论】:

  • 阅读公用表表达式(通常缩写为“CTE”)。一旦你掌握了这些,请阅读递归 CTE :-)
  • 发布更多细节,你的桌子,你想要什么结果,你尝试了什么......

标签: sql-server tsql common-table-expression hierarchical


【解决方案1】:
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'

【讨论】:

  • 但是,此查询返回组织的整个层次结构。如何将树限制为只有 Ryan 的老板??
  • 把 BossOf 想象成一个 SQL 视图,在下一次查询后被丢弃。
  • 请注意,您可能需要在此代码之前显式使用分号。
  • 非常感谢,阿伦!然而,这是我想避免的。我公司的实际数据层次结构非常大,首先检索整个树然后查找 A 是否为 B 的子级看起来非常昂贵。 ??
  • 其实可以试试查询。 SQL Server 的查询计划器实际上会比您预期的更高效。临时视图 (CTE) 从未实现过。此外,由于它是内联的,查询规划器将重新排列查询并将 WHERE Id = 'Ryan' 放在最深的嵌套中。运行这个查询实际上很便宜。
猜你喜欢
  • 1970-01-01
  • 2021-09-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-15
  • 2011-11-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多