zoukankan      html  css  js  c++  java
  • Oracle 自连接深度查询

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

  • 相关阅读:
    hdu1002
    hdu1008
    hdu1000
    fzu2089
    hdu1003
    hdu1004
    HDU1019
    《那些年啊,那些事——一个程序员的奋斗史》——87
    《那些年啊,那些事——一个程序员的奋斗史》——83
    《那些年啊,那些事——一个程序员的奋斗史》——89
  • 原文地址:https://www.cnblogs.com/lanfengniao/p/3111979.html
Copyright © 2011-2022 走看看