Oracle 自连接深度查询

本文介绍了在Oracle数据库中如何使用层次查询来获取多级关系数据,对比了自连接查询的局限性,并通过具体示例展示了如何利用CONNECT BY PRIOR实现多层次的数据检索。

通常当一个表涉及到自连接的时候,我们在查询时,都会采用 join 自身,用不同的别名。

如下:

SELECT TC.AGENCYNAME, ' REPORT FOR ', TP.AGENCYNAME
  FROM T_AGENCY TP
 INNER JOIN T_AGENCY TC
    ON TP.AGENCYID = TC.PARENTID
 WHERE TP.AGENCYID = 2;

结果如下:

从结果可以看出,这样的查询只能得到一层关系的数据,那么如果想要得到更多层级的结果呢?

显然这样的方式,已经不能满足我们的需求了。

那么 我们再看下 Oracle 的层次查询:

SELECT AGENCYNAME, ' REPORT FOR ', PRIOR AGENCYNAME
FROM T_AGENCY
START WITH AGENCYID = 2 ---规定遍历从属关系树的起点
CONNECT BY PRIOR AGENCYID = PARENTID;

采用的是 CONNECT BY PRIOR , PRIOR 代表的是上一级的表。

CONNECT BY PRIOR AGENCYID = PARENTID;

就如同上述 inner join 方式 中的 

 TP.AGENCYID = TC.PARENTID

看结果:

从结果看,这里包含了所有字节点的内容。

看下条理比较顺的查询结果,

SELECT LPAD(' ', 2 * LEVEL - 1) || SYS_CONNECT_BY_PATH(AGENCYNAME, '/') "PATH"
FROM T_AGENCY
START WITH AGENCYID = 2 ---规定遍历从属关系树的起点
CONNECT BY PRIOR AGENCYID = PARENTID;

直接看结果:

这样层次结构就更清楚了。

参考自:

oracle 的自连接(self join)操作

 

转载于:https://www.cnblogs.com/lanfengniao/archive/2013/06/01/3111979.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值