数据中可能存在层次关系,本文章主要介绍查询这种关系的实例。会大量使用递归式 CTE

  Emps 表中 EName 员工和 MGR 上级之间的关系如下:

  

  每个上级也同样是员工,主管和员工之间为父子关系。

1.呈现父子关系

  情景:返回员工数据的同时返回上级信息(名字,角色,薪水)。如下:

  

  解决方案:基于 MGR 和 EName 相等自连接,找出每个员工上级的数据即可解决。

SELECT a.EName 员工名,a.MGR 上级,b.SAL 上级薪水,B.Role 上级角色 FROM test.emps a
left join test.emps b on a.MGR = b.EName

  也可以使用标量子查询,注意标量子查询只能返回一列。

 select a.EName 员工名,
(select b.EName FROM test.emps b where b.EName = a.MGR) 上级,
(select b.SAL FROM test.emps b where b.EName = a.MGR) 上级薪水,
(select b.Role FROM test.emps b where b.EName = a.MGR) 上级角色
FROM test.emps a;

2.呈现子-父-祖父关系

  情景:员工A的上级是员工M,员工M的上级是员工B,员工B的上级是员工Z。想要呈现出这种关系。如下图:

  

  解决方案:由于要呈现的关系包含多层关系,而且是动态的,所以可以使用CTE递归来实现。

 with RECURSIVE empss as(
select EName,MGR,ENAme as Re from test.emps
union all
select a.EName as EName, b.MGR as MGR,CONCAT(a.Re , '->' , b.EName) as Re from empss a
left join emps b on a.MGR = b.EName
where a.MGR is not null
) select EName 员工,Re 关系 from empss where MGR is null

 3.创建基于表的分层视图

  情景:返回一个结果集,将整张表的层次结构呈现出来。在 emps 表中,员工Z上没有上级。从员工Z 开始显示所有下属以及这些下属所有的下属。如下:

  

  解决方案:该结果集相当于上一个情景反过来,区别在于从根开始。同样这里使用 CTE 递归。先找到根,然后通过 EName 和 MGR 连接寻找下属。

with recursive empss as(
SELECT EName as Re,EName FROM test.emps where MGR is null
union all
SELECT concat(b.Re,'-',a.EName) as Re,a.EName FROM test.emps a
join empss b on a.MGR = b.EName ) select Re 关系 from empss order by Re

4.确定叶子节点、分支节点和根节点

  情景:判断给定的行是哪种类型:叶子节点、分支节点还是根节点。在员工表中,叶子节点指的是不是任何员工上级的员工,分支节点指的是自己是上级且还是某个员工的下属,根节点指的是没有上级的员工。如下:

  

  解决方案:使用标量子查询在每行每个节点类型列中返回布尔值。是否叶子节点,通过判断上级是该员工的员工数量,如果是0就表示该员工是叶子节点。是否分支节点,通过判断该员工是否存在上级,并且上级是该员工的员工数量大于0,如果大于0表示该员工是分支节点,这里使用 sign() 函数返回标志。是否根节点,只需要判断该员工是否没有上级即可。

SELECT EName,
(select count(*)=0 from test.emps b where a.EName = b.MGR ) as 是否叶子节点,
(select sign(count(*)) from test.emps b where a.EName = b.MGR and a.MGR is not null) as 是否分支节点,
a.MGR is null as 是否根节点
FROM test.emps a;

SQL分层查询的更多相关文章

  1. oracle之分层查询

    ORACLE分层查询start with&connect by 分层查询是select 语句的扩展,目的是迅速找出表中列-列的隶属关系. 19.1 树的遍历 ORACLE是一个关系数据库管理系 ...

  2. Linq to SQL 语法查询(链接查询,子查询 & in操作 & join,分组统计等)

    Linq to SQL 语法查询(链接查询,子查询 & in操作 & join,分组统计等) 子查询 描述:查询订单数超过5的顾客信息 查询句法: var 子查询 = from c i ...

  3. SQL联合查询:子表任一记录与主表联合查询

    今天有网友群里提了这样一个关于SQL联合查询的需求: 一.有热心网友的方案: 二.我的方案: select * from ( select a.*,(select top 1 Id from B as ...

  4. SQL 提高查询效率

    1.关于SQL查询效率,100w数据,查询只要1秒,与您分享: 机器情况p4: 2.4内存: 1 Gos: windows 2003数据库: ms sql server 2000目的: 查询性能测试, ...

  5. sql语句查询

    1. sql语句查询某位数字或者某几位数字开头的数据,字段类型为数字类: %’: 2. sql搜索以4开头和含有李字的数据: select * from wlzbpre_user where real ...

  6. SQL联合查询(内联、左联、右联、全联)的语法(转)

    最近在做一个比较复杂的业务,涉及的表较多,于是在网上找了一些sql联合查询的例子进行研究使用. 概述: 联合查询效率较高,举例子来说明联合查询:内联inner join .左联left outer j ...

  7. phpcmsv9自定义sql语句查询模型实现

    在phpcmsv9中,自定义sql语句查询可不太好实现,传入sql语句查询很容易被内部转入生成一系列莫名其妙的sql语句,比如最佳前缀等等,直接造成sql语句查询错误,在此也提供两种解决办法,1修改底 ...

  8. [转]一个用户SQL慢查询分析,原因及优化

    来源:http://blog.rds.aliyun.com/2014/05/23/%E4%B8%80%E4%B8%AA%E7%94%A8%E6%88%B7sql%E6%85%A2%E6%9F%A5%E ...

  9. 怎样用SQL语句查询一个数据库中的所有表?

    怎样用SQL语句查询一个数据库中的所有表?  --读取库中的所有表名 select name from sysobjects where xtype='u'--读取指定表的所有列名select nam ...

随机推荐

  1. Mybatis简单入门--插入数据

    1. 开发环境 IDE:IDEA 构建工具:maven4.0.0 MySQL版本:8.0.11. 记得创建好数据库 Mybatis版本:3.5.7 MySQL不同版本的注意事项 驱动类driver-c ...

  2. DTSE Tech Talk丨第3期:解密数据隔离方案,让SaaS应用开发更轻松

    摘要:解读云上前沿技术,畅聊开发应用实践.专家团队授课,答疑解惑,助力开发者使用华为云开放能力进行应用构建.技术创新. 围绕当下许多企业青睐的SaaS应用开发,华为云DTSE技术布道师李良龙为大家带来 ...

  3. [HNOI2011]卡农 (数论计数,DP)

    题面 原题面 众所周知卡农是一种复调音乐的写作技法,小余在听卡农音乐时灵感大发,发明了一种新的音乐谱写规则. 他将声音分成 n n n 个音阶,并将音乐分成若干个片段.音乐的每个片段都是由 1 1 1 ...

  4. ABAQUS和UG许可证冲突问题的解决方案

    前段时间重新安装了ABAQUS,更新到了2020版本后,发现NX UG怎么突然打不开了,搜索一下,发现是两个许可证有冲突.找了很多解决方案,主要归纳为以下两种: 方法一:Lmtools修改法 先说结论 ...

  5. 7个技巧让你写出干净的 TSX 代码

    原文链接:https://dev.to/ruppysuppy/7-tips-for-clean-react-typescript-code-you-must-know-2da2 "干净的代码 ...

  6. java代码审计的点

    java代码审计的点 组件的审计 首先看pom.xml查看第三方组件和第三方组件的版本 常用的第三方组件: 第三方组件 漏洞类型 组件漏洞版本 log4j2 远程代码执行 Apache log4j2 ...

  7. Linux 破解mysql密码(详细步骤)

    当mysql密码忘记时 [root@master ~]# mysql -uroot -p1 mysql: [Warning] Using a password on the command line ...

  8. centos7设置时间和上海时区并进行同步

    1.设置时区(同步时间前先设置) timedatectl set-timezone Asia/Shanghai 2.安装组件 yum -y install ntp systemctl enable n ...

  9. Java中如何创建不可变(immutable)类

    什么是不可变类 1. 不可变类是指类的实例一经创建完成,这个实例的内容就不会改变. 2. Java中的String和八个基本类型的包装类(Integer, Short, Byte, Long, Dou ...

  10. docker-compose安装harbor

    目录 Harbor 安装环境说明 获取安装包(离线安装方式) 安装harbor 用docker-compose查看Harbor容器的运行状态 Harbor访问测试 上传镜像到Harbor服务器 Har ...