MYSQL中递归存储过程获取分层数据的性能

2023-12-03

我有餐桌员工,
员工 ( emp_id int 主键, emp_name varchar(50), mngr_id int)

这里 mngr_id 要么为 null,要么包含有效的 emp_id。这样就形成了组织中员工的层次结构。

为了遍历整个层次结构,我必须编写递归存储过程。 (在 Oracle 中,使用 CONNECT BY .. START WITH 很容易)

所以问题是,考虑到层次结构的级别不会超过 10 级,这种存储过程对性能有何影响!

还有其他方法可以达到同样的效果吗?


一个相当简单的迭代邻接列表数据库服务器端解决方案:http://pastie.org/1056977

delimiter ;

drop procedure if exists employee_hier;

delimiter #

create procedure employee_hier
(
in p_emp_id smallint unsigned
)
begin

declare p_done tinyint unsigned default(0);
declare p_depth smallint unsigned default(0);

create temporary table hier(
 boss_id smallint unsigned, 
 emp_id smallint unsigned, 
 depth smallint unsigned
)engine = memory;

insert into hier values (null, p_emp_id, p_depth);

/* http://dev.mysql.com/doc/refman/5.0/en/temporary-table-problems.html */

create temporary table emps engine=memory select * from hier;

while p_done <> 1 do

    if exists( select 1 from employee e inner join hier on e.boss_id = hier.emp_id and hier.depth = p_depth) then

        insert into hier select e.boss_id, e.emp_id, p_depth + 1 
            from employee e inner join emps on e.boss_id = emps.emp_id and emps.depth = p_depth;

        set p_depth = p_depth + 1;          

        truncate table emps;
        insert into emps select * from hier where depth = p_depth;

    else
        set p_done = 1;
    end if;

end while;

select 
 e.emp_id,
 e.name as emp_name,
 b.emp_id as boss_emp_id,
 b.name as boss_name,
 hier.depth
from 
 hier
inner join employee e on hier.emp_id = e.emp_id
inner join employee b on hier.boss_id = b.emp_id;

drop temporary table if exists hier;
drop temporary table if exists emps;

end #

delimiter ;


call employee_hier(1);
call employee_hier(3);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MYSQL中递归存储过程获取分层数据的性能 的相关文章

随机推荐

  • Access 2010 限制查询结果

    MS Access 2010 中用于将查询结果限制为前 1 000 个的语法是什么 我试过这个 SELECT tblGL Cost Centre Code FROM tblGL LIMIT 1000 但我收到错误 FROM 子句中的语法错误
  • 有什么方法可以控制 blockproc 输出的串联吗?

    这是问题的后续 使用 blockproc 或 im2col 在图像上重叠滑动窗口 所以通过使用代码 B blockproc A 1 1 block fun BorderSize 2 2 TrimBorder false PadPartial
  • 使用 geom_line 连接缺失值

    我试图弄清楚是否可以使用 geom line 连接缺失值 例如 在下面的链接中 构面 F 中的时间 3 处缺少值 在这种情况下 我想要一条线来连接时间 2 和 4 有办法实现这一点吗 https farm8 staticflickr com
  • 从自定义表格视图单元格发送重新加载数据?

    我将如何从自定义 tableViewCell 向 tableView 发送 reloadData 消息 实现这一点的最简单方法是使用委托 在 CustomTableCell h 中定义一个协议 如下所示 protocol CustomTab
  • 递归 - 数字按相反顺序排列

    我需要实现一个递归方法 printDigits 它将整数 num 作为参数 并以相反的顺序打印其数字 每行一位数字 这是我到目前为止所拥有的 public class PrintDigits public static void main
  • 启动层初始化时发生错误 FindException: Module not found

    使用 Java 9 执行简单的 Hello World 程序会导致以下错误消息 boot层初始化时出错java lang module FindException 找不到模块 com pantech myModule 我执行的命令行是 ja
  • 使用 VBA 宏在 CATIA V5R19 中实例化 PowerCopy

    我不知道如何使用 VBA 宏实例化 Power copy 我有一个 CATPart1 其 Power copy 名称为 MyPC 我想在当前部分实例化这个超级副本 仅举例来说 此超级复制输入为 Plane Start point 和 End
  • 查找“立体校正”两个摄像机之间的旋转矩阵

    所以我有一个深度图以及相机的外部和内部 我想取回 3D 点和表面法线 我正在使用该函数重新投影图像至 3D 在stereo rectify函数中找到Q如何得到旋转矩阵between第一和第二相机的坐标系 我有单独的旋转矩阵和平移向量 但如何
  • Android Studio:使用 Mongo Java 驱动程序连接到 MongoDB 服务器

    关于这个问题有很多帖子 但似乎没有人能解决问题 所以也许有些事情已经改变了 我正在尝试将我的 Android 应用程序连接到位于 mLab 上的 MongoDB 服务器 我正在使用 Mongo Java Drived 当然已经将库添加到了
  • Vera ++ TCL规则:列出所有局部变量[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心以获得指导 我正在尝试为 vera 静
  • Datagrid (WPF) 以编程方式设置列样式(不是 xaml)

    我已经看过了 但还没有找到我正在寻找的确切答案 我有一个绑定到数据源的 DataGrid 视图 我想在带有数据网格的窗口可见后以编程方式设置列的样式 我也想根据一些行为时不时地改变它 我尝试使用 DataGridTemplateColumn
  • 如何在C#中删除注册表值

    我可以使用 Microsoft Win32 Registry 类获取 设置注册表值 例如 Microsoft Win32 Registry SetValue HKEY CURRENT USER Software Microsoft Wind
  • 为我的条形码阅读器读取和写入数据到缓冲区的最佳方法是什么?

    我需要用 C 语言为 Linux 的条形码阅读器编写一个驱动程序 条形码阅读器通过串行总线工作 当我向条形码阅读器发送一组命令时 条形码阅读器应该向我返回状态消息 我设法配置端口并创建信号处理程序 在信号处理程序中 我读取串行总线接收的数据
  • 如何搜索在 Json 中注册为数组的日期?

    如何搜索在 Json 中注册为数组的日期 PostgreSQL 是数据库 下面是相关代码 1 Model class Business db Model tablename business id db Column db Integer
  • GitHub api 获取最后 N 次提交

    是否可以使用 GitHub API 获取 GitHub 存储库中特定分支的最后 N 次提交 我刚刚发现了一些关于提交的 GitHub api 详细信息here 但他们都没有提供有关最后 N 次提交的详细信息 任何人都可以对此提供更好的想法吗
  • 具体详细说明了 NSUserDefaultsDidChangeNotification 上的默认值已更改的内容

    我开始进入 NSUserDefaults 的内部密室 现在我可以使用提供的选择器加上 NSNotification 对象作为参数成功拦截 NSUserDefaultsDidChangeNotification 通知 然而 返回的 NSNot
  • R-lang:如果等于引号,则删除第一个字符

    R新手 我正在尝试从数据框中的行的开头和结尾删除 如果引号不是第一个或最后一个字符 我不想删除 我不确定为什么以下内容不适用于我的数据的数据框 其中每一行都是文本的数据点 引号并不是字符串 而是文本的一部分 数据框的一行看起来像这样 x l
  • 在 bash 中获取当前日期而不生成子进程

    这个问题纯粹是好奇心 通过运行以下命令很容易获得日期date来自 bash 的命令 但它是一个外部可执行文件 需要生成一个子进程 我想知道是否可以在没有子进程的情况下获取当前时间 日期的格式 我只能在以下上下文中找到对日期 时间格式的引用P
  • RabbitMQ 消费者过载

    我一直在阅读有关 AMQP 消息传递确认的原理 https www rabbitmq com confirms html 确实很有帮助且写得很好的文章 但有关消费者致谢的一个特别的事情确实令人困惑 以下是引用 使用自动确认模式时需要考虑的另
  • MYSQL中递归存储过程获取分层数据的性能

    我有餐桌员工 员工 emp id int 主键 emp name varchar 50 mngr id int 这里 mngr id 要么为 null 要么包含有效的 emp id 这样就形成了组织中员工的层次结构 为了遍历整个层次结构 我