Oracle数据库自连接查询的缺点及解决方法

问题:我们在Oracle数据库中,如果需求要查询出 EMP 表中的所有员工及员工对应的领导时,就需要用到自连接查询:

查询语句如下:

select e.empno,e.ename,e.mgr from emp e,emp b
where e.empno = b.mgr;
       但是,我们知道,自连接至少需要有两张表,并且会进行笛卡尔全集,(笛卡尔积:两张表行数的乘积)所以自连接查询出来的记录会是此表数据量的平方。

因此,自连接查询的缺点很明显:不适合操作大表。

解决办法:层次查询。

        层次查询是单表查询,不存在产生笛卡尔积。层次查询在某些情况下可以替代自连接,本质上是单表查询。所以,对于大表需要自连接查询时,我们可以使用层次查询来拟补自连接的缺点及带来的问题。

层次查询语句:

select empno,ename,mgr from emp
connect by prior empno = mgr
start with empno = 7369;
层次查询不用 where 表示,用 connect by 表示,start with 是从树的那个节点开始查询。如果是从根节点也可以用start with mgr is null; 来查询出所有节点的结果。当然,也可以对层次查询的深度进行表示,比如用level来表示层次深度,那么我们的查询语句可以写成:

select level,empno,ename,mgr from emp
connect by prior empno = mgr
start with mgr is null
order by 1;
       其中,mgr is null 表示是从根节点开始查询的,如果不是从根节点开始的使用第一种方式。

自连接与层次查询的比较:

自连接:自连接得到的查询结果比较直观但是不适合操作大表。

层次查询:层次查询只涉及一张表,不产生笛卡尔积,但得到的结果可能不太直观。

       总结:不同的查询语句有不同的特点,都不是万能的。

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值