• Oracle级联查询


    在ORACLE 数据库中有一种方法可以实现级联查询
     
    select  *                //要查询的字段
    from table              //具有子接点ID与父接点ID的表 
    start with selfid=id      //给定一个startid(字段名为子接点ID,及开始的ID号)
    connect by prior selfid=parentid       //联接条件为子接点等于父接点
     
    这个SQL主要用于级联查询,给一个父接点可以查出所有的子接点。及子接点的子接点,一查到底,很实用。
     
    例:航班表airline,如何用sql语句查询出从广州出发能到达的所有目的地,允许任意中转。
     
    FLIGHTNO ORIGIN  DESTINATION
    -------------------------------------------
    cz3001  CAN  CSX
    cz3002  CAN  SHA
    cz3003  CSX  SHA
    cz3004  CSX  PEK
    cz3005  SHA  XIY
    cz3006  SHA  SWA
    cz3007  PEK  URC
    cz3008  PVC  AMS
    cz3009  WUH  PVC
    cz3010  WUH  XIY
     
    这里根就是CAN,SQL语句如下:
     
    select t.destination from airline t start with origin='CAN' connect by prior destination = origin;
     
    查询结果:

    DESTINATION
    -------------------
    CSX  
    SHA  
    XIY  
    SWA  
    PEK  
    URC  
    SHA  
    XIY  
    SWA 
     

    9 rows selected.
     
    --------------------------------
     
     
    在网上看到下面的例子应该更容易理解些,转载一下:
     
     
    数据结构如下:
    t1
     t11
         t111
            t1111
     t12
         t121
            t1211
     
    db数据字段如下:
    task_id             task_name         t.parent_task_id       ***
    ***                     ***                          ***                               ***
    000001            t1                         ***                                 ***
    000002            t11                       000001                        ***
    000005            t12                       000001                         ***
    000003            t111                    000002                         ***
    000004            t1111                  000003                         ***
    000006            t121                    000005                         ***
    000007            t1211                  000006                         ***
    ***                     ***                       ***                                 ***

    查询语句:

    select t.task_id ,t.task_name ,t.parent_task_id 
    from t_task t 
    start with task_id='000001'
    connect by prior task_id = parent_task_id;
    http://roucheng.cnblogs.com/
    结果显示:
    task_id                 task_name          t.parent_task_id
    000001                t1           
    000002                t11                       000001
    000003                t111                     000002
    000004                t1111                    000003
    000005                t12                       000001
    000006                t121                     000005
    000007                t1211                   000006

    strat with 指定层次开始的条件,即是说满足这个条件的行即可以做为层次树的最顶层 
      
    connect by prior指层之间的关联条件,即什么样的行是上层行的子行(自连接条件)
     
    select level ,id,name,parentid from temptable2 
      connect by prior parentid(属于顶层的列)=id(子层的列)  start with id =1

    http://www.cnblogs.com/roucheng/p/5404594.html

  • 相关阅读:
    [APIO2014]序列分割
    [USACO08MAR]土地征用Land Acquisition
    Cats Transport
    [ZJOI2007]仓库建设
    [CEOI2004]锯木厂选址
    Print Article
    Interval 间隔问题
    Trie树
    动态规划-子数组乘积小于k的总个数 Subarray Product Less Than K
    动态规划-独特的子字符串存在于Wraparound String总个数 Unique Substrings in Wraparound String
  • 原文地址:https://www.cnblogs.com/roucheng/p/oraclejilian.html
Copyright © 2020-2023  润新知