代码之家  ›  专栏  ›  技术社区  ›  Rob van Laarhoven

分层查询

  •  2
  • Rob van Laarhoven  · 技术社区  · 17 年前

    PARENT_ID   CHILD_ID          EXAM
    TUDA12802   TUDA12982         N 
    TUDA12982   TUDA12984         J    
    TUDA12984   TUDA999           J
    TUDA12982   TUDA12983         N
    TUDA12983   TUDA15322         J
    TUDA12983   TUDA15323         J
    

    TUDA12982 N
    - TUDA12984 J
    --  TUDA999 J
    - TUDA12983 N
    --  TUDA15322 J
    --  TUDA15323 J
    

    我需要的是一个包含所有记录的列表,其中exam=N,底层exam=J,可以嵌套。

    select *
    from test1 
    connect by prior child_id = parent_id
    start with child_id = 'TUDA12982'
    order siblings by child_id;
    

    给我

    PARENT_ID      CHILD_ID          EXAM
    TUDA12802   TUDA12982         N 
    TUDA12982   TUDA12984         J    
    TUDA12984   TUDA999           J
    TUDA12982   TUDA12983         N
    TUDA12983   TUDA15323         J
    TUDA12983   TUDA15322         J
    

    TUDA12802   TUDA12982         N 
    TUDA12982   TUDA12984         J 
    TUDA12984   TUDA999           J
    

    当我遇到考试='N'记录时,遍历需要停止。

    select *
    from test1 
    connect by prior child_id = parent_id
    start with child_id = 'TUDA12982'
    stop with exam = 'N'
    order siblings by child_id;
    

    如何做到这一点?

    2 回复  |  直到 17 年前
        1
  •  4
  •   Rob van Wijk    17 年前

    罗伯特,

    您可以通过在connect by子句中添加“exam='J'”来完成此操作:

    SQL> create table test1(parent_id,child_id,exam)
      2  as
      3  select 'TUDA12802', 'TUDA12982', 'N' from dual union all
      4  select 'TUDA12982', 'TUDA12984', 'J' from dual union all
      5  select 'TUDA12984', 'TUDA999', 'J' from dual union all
      6  select 'TUDA12982', 'TUDA12983', 'N' from dual union all
      7  select 'TUDA12983', 'TUDA15322', 'J' from dual union all
      8  select 'TUDA12983', 'TUDA15323', 'J' from dual
      9  /
    
    Tabel is aangemaakt.
    
    SQL>  select parent_id
      2        , child_id
      3        , exam
      4        , level
      5        , lpad(' ',2*level) || sys_connect_by_path(parent_id||'-'||child_id,'/') scbp
      6     from test1
      7    start with exam = 'N'
      8  connect by prior child_id = parent_id
      9      and exam = 'J'
     10  /
    
    PARENT_ID CHILD_ID  E  LEVEL SCBP
    --------- --------- - ------ ----------------------------------------------------------------------
    TUDA12802 TUDA12982 N      1   /TUDA12802-TUDA12982
    TUDA12982 TUDA12984 J      2     /TUDA12802-TUDA12982/TUDA12982-TUDA12984
    TUDA12984 TUDA999   J      3       /TUDA12802-TUDA12982/TUDA12982-TUDA12984/TUDA12984-TUDA999
    TUDA12982 TUDA12983 N      1   /TUDA12982-TUDA12983
    TUDA12983 TUDA15322 J      2     /TUDA12982-TUDA12983/TUDA12983-TUDA15322
    TUDA12983 TUDA15323 J      2     /TUDA12982-TUDA12983/TUDA12983-TUDA15323
    
    6 rijen zijn geselecteerd.
    

    当做

        2
  •  0
  •   Timothy Walters    17 年前

    听起来像是一个获取请求项的简单查询,它的“J”子项是您想要的,所以这不起作用:

    select *
    from test1 
    where child_id = 'TUDA12982'
    or exam = 'J'
    connect by prior child_id = parent_id
    start with child_id = 'TUDA12982'
    order siblings by child_id;