sql - 查询三层表的 SQL 性能
问题描述
我有一张人员表,其中包括每个人的 ID 以及他们在工作层次结构中的 Boss 的 ID(最多 3 层)。例如,该表可能如下所示:
ID BossID
1 NULL
2 1
3 1
4 1
5 2
6 3
7 3
8 2
9 3
10 NULL
所以 1 和 10 没有老板,1 是 2,3 和 4 的老板。2 是 5 和 8 的老板,等等。我想要的是一种查询这张表的方法,这样我就可以找到所有人在层次结构中低于指定 ID,例如,如果查询 ID 1,则返回 1、2、3、4、5、6、7、8 和 9,如果我查询 2,则返回 2、5,以及8.我目前的尝试是:
with Hierarchy AS (
select a.ID as AncestorID, a.ID as DescendantID, 0 as Depth from BossTable a
UNION ALL
select CTE.AncestorID, a.ID, CTE.Depth + 1 from BossTable a
inner join Hierarchy CTE on a.BossID = CTE.DescendantID
)
select a.AncestorID, a.DescendantID, a.Depth from Hierarchy a
它确实返回了我正在寻找的东西,但是查询速度很慢并且会导致生产问题。我的理想目标是把它变成一个可以被索引的视图,但目前这是不可能的,因为它不能像其他索引那样具有唯一的聚集索引。BossTable 也可以经常编辑,将人员转移到不同的老板,添加或删除,因此使用此数据创建另一个表是不现实的。
任何建议将不胜感激,只是希望尽可能高效。
解决方案
推荐阅读
- oracle - Oracle MERGE 语句是否在提交完成之前返回
- r - R:使用观察次数删除变量
- tfs - 下载 TFS 流程模板
- react-native - React-native Flatlist 问题不使用 fetch api 呈现单个项目
- javascript - 如何以动态方式从一个元素到另一个元素绘制一条线?
- sql - 日期时间 SQL 语句(在 SQL Developer 中工作)
- c++ - 来自非零坐标的向量中的 8 邻域
- python - 如果我从实例调用 driver.close() ,它不会关闭 selenium 上的选项卡
- c# - 测试通过但代码覆盖率为 0%
- android - 在 React Native 中获取 Android 设备的设备间距