oracle查询mgr,Oracle查询之层次查询示例

现在有一个需求:

在emp表中查询员工信息: ***的老板是***

如果使用自连接,自然很容易就能查出结果。

sql语句:

select e.ename||'的老板是'||b.ename

from emp e,emp b

where e.mgr=b.empno; 结果如下:

E.ENAME||'的老板是'||B.ENAME

----------------------------

FORD的老板是JONES

SCOTT的老板是JONES

JAMES的老板是BLAKE

TURNER的老板是BLAKE

MARTIN的老板是BLAKE

WARD的老板是BLAKE

ALLEN的老板是BLAKE

MILLER的老板是CLARK

ADAMS的老板是SCOTT

CLARK的老板是KING

BLAKE的老板是KING

E.ENAME||'的老板是'||B.ENAME

----------------------------

JONES的老板是KING

SMITH的老板是FORD 但是如果这张表有上千万,上亿条记录呢。这时产生的笛卡尔集将会非常大,明显影响系统性能。

所以这时候就需要使用层次查询。

如果将上面的结果组织一下的话,可以得出下面这张图:

a14997116541fab44f2da786650b8afd.png

可以看出这是一个树,level指树的深度。

在层次查询只能有一张表,并且不再是表和表的连接了,而是同一张表的前后两次操作。从表面上看我们对这张表操作了多次,实际上内部算法只是对这张表操作了一次。

使用层次查询解决这个需求的话,sql语句就是:

select level,empno,ename,mgr

from emp

connect by prior empno=mgr

start with mgr is null

order by 1; connect by表示后一次操作的某列值等于前一次操作的某列值,start with指从树的哪个深度或者说哪个节点开始查询。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值