通常当一个表涉及到自连接的时候,我们在查询时,都会采用 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;
直接看结果:
这样层次结构就更清楚了。
参考自: