通常当一个表涉及到自连接的时候,我们在查询时,都会采用 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)操作

 

posted on 2013-06-01 11:47  lanfengniao  阅读(552)  评论(0编辑  收藏  举报