您的位置:首页 > 数据库 > Oracle

Oracle查询之层次查询示例

2012-11-18 00:20 387 查看
现在有一个需求:

在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
但是如果这张表有上千万,上亿条记录呢。这时产生的笛卡尔集将会非常大,明显影响系统性能。
所以这时候就需要使用层次查询。

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



可以看出这是一个树,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指从树的哪个深度或者说哪个节点开始查询。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: