天天看点

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 表示是从根节点开始查询的,如果不是从根节点开始的使用第一种方式。

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

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

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

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

推荐赵强老师的视频讲解:https://www.imooc.com/video/8513/0