美文网首页
MySQL 确定哪些是叶节点、分子节点、根节点

MySQL 确定哪些是叶节点、分子节点、根节点

作者: 只是甲 | 来源:发表于2021-02-26 13:41 被阅读0次

备注:测试数据库版本为MySQL 8.0

如需要scott用户下建表及录入数据语句,可参考:
scott建表及录入数据sql脚本

一.需求

确定给定行属于哪些类型的节点: 叶节点、分支节点及根节点。

对于这个例子,叶节点表示该员工不是经理;分支节点上的员工即是经理,又有经理根节点是没有经理的员工。
通过返回1(TRUE)或0(FALSE),

二.解决方案

请注意,EMP表是树状层次模型,而不是递归层次模型,根节点的mgr值为null。
如果emp是递归层次模型的话,根节点应有自引用(即员工KING的mgr值将是KING的empno)。
实际上,自引用并不直观,故这里将根节点的mgr设为null值。
对于递归层次模型中使用 connect by(Oracle)或with的情况,请务必当心:SQL可能会死循环,如果一定要采用递归层次,代码中必须考虑避免这样的循环。

select  e.ename,
        (select sign(count(*)) from emp d
          where 0 =
            (select count(*) from emp f
              where f.mgr = e.empno)) as is_leaf,
        (select sign(count(*)) from emp d
          where d.mgr = e.empno
            and e.mgr is not null) as is_branch,
        (select sign(count(*)) from emp d
          where d.empno = e.empno
            and d.mgr is null) as is_root
  from  emp e
 order  by 4 desc,3 desc;

测试记录:

mysql> select  e.ename,
    ->         (select sign(count(*)) from emp d
    ->           where 0 =
    ->             (select count(*) from emp f
    ->               where f.mgr = e.empno)) as is_leaf,
    ->         (select sign(count(*)) from emp d
    ->           where d.mgr = e.empno
    ->             and e.mgr is not null) as is_branch,
    ->         (select sign(count(*)) from emp d
    ->           where d.empno = e.empno
    ->             and d.mgr is null) as is_root
    ->   from  emp e
    ->  order  by 4 desc,3 desc;
+--------+---------+-----------+---------+
| ename  | is_leaf | is_branch | is_root |
+--------+---------+-----------+---------+
| KING   |       0 |         0 |       1 |
| JONES  |       0 |         1 |       0 |
| BLAKE  |       0 |         1 |       0 |
| CLARK  |       0 |         1 |       0 |
| SCOTT  |       0 |         1 |       0 |
| FORD   |       0 |         1 |       0 |
| SMITH  |       1 |         0 |       0 |
| ALLEN  |       1 |         0 |       0 |
| WARD   |       1 |         0 |       0 |
| MARTIN |       1 |         0 |       0 |
| TURNER |       1 |         0 |       0 |
| ADAMS  |       1 |         0 |       0 |
| JAMES  |       1 |         0 |       0 |
| MILLER |       1 |         0 |       0 |
+--------+---------+-----------+---------+
14 rows in set (0.00 sec)

相关文章

  • MySQL 确定哪些是叶节点、分子节点、根节点

    备注:测试数据库版本为MySQL 8.0 如需要scott用户下建表及录入数据语句,可参考:scott建表及录入数...

  • 红黑树

    对某个节点左旋转是把某个节点变成左节点对某个节点右旋转是把某个节点变成右节点 1、根节点是黑节点2、叶节点是黑节点...

  • 描述 树是一个分层数据的抽象模型 相关术语 根节点 祖先节点 后代节点 父节点 子节点 内部节点 外部节点(叶节点...

  • 第二十三节-二叉树基础(上)

    树 根节点:没有父节点的节点 叶节点:没有子节点的节点 节点的高度:节点到叶子节点的最长路径,从 0 开始 节点的...

  • 二叉树

    二叉树 概念 父节点、子节点 兄弟节点:具有相同父节点的子节点 根节点:没有父节点的节点 叶子节点(叶节点):没有...

  • 【集合框架】红黑树

    红黑树与TreeMap 基本性质 每个节点都只能是红色或者黑色 根节点是黑色 每个叶节点(NIL节点,空节点)是黑...

  • 红黑树

    红黑树满足如下特性 每个节点要么是红色,要么是黑色。根节点必须是黑色每个叶节点(NIL或空节点)是黑色;红色节点不...

  • 二叉树的深度

    输入一棵二叉树的根节点,求该树的深度。从根节点到叶节点依次经过的节点(含根、叶节点)形成树的一条路径,最长路径的长...

  • [剑指Offer]55-I 二叉树的深度

    输入一棵二叉树的根节点,求该树的深度。从根节点到叶节点依次经过的节点(含根、叶节点)形成树的一条路径,最长路径的长...

  • 面试题55-1.二叉树的深度_hn

    题目描述 输入一棵二叉树的根节点,求该树的深度。从根节点到叶节点依次经过的节点(含根、叶节点)形成树的一条路径,最...

网友评论

      本文标题:MySQL 确定哪些是叶节点、分子节点、根节点

      本文链接:https://www.haomeiwen.com/subject/plaamktx.html