国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 數據庫 > Oracle > 正文

Oracle--樹的使用(Connect By)

2024-08-29 13:39:13
字體:
來源:轉載
供稿:網友

  表    tree
  字段   master
       sub
       sales
  insert into tree values
  ('主1',   '主2',  15); 
  insert into tree values   
  ('主1',   '主3',  20);     
  insert into tree values
  ('主2',   '主4',  5);          
  insert into tree values
  ('主2',   '主5',  10);
  insert into tree values
  ('主3',   '主5',  30);
  insert into tree values
  ('主3',   '主6',  40);
  
  SQL> select * from tree;
  MASTER   SUB       SALES
  ---------- ---------- ----------
  主1    主2        15
  主1    主3        20
  主2    主4         5
  主2    主5        10
  主3    主5        30
  主3    主6        40 
  
  假如用樹型結構表示如下:
   '主1'          
     -'主2'       
       --'主4'
       --'主5'
   '主1'          
     -'主3'       
       --'主5'
       --'主6'
  
  SQL> select * from tree                
  start with sub='主2'     --相當于普通sql的where條件
  connect by PRior master=sub; --遍歷的順序是sub先于master遍歷,也就是說從sub往上遍歷一直到master(根節點)
   2 
  MASTER   SUB       SALES
  ---------- ---------- ----------
  主1    主2        15
  
  
  SQL> select * from tree                
  start with master='主2'
  connect by prior master=sub; --sub往上遍歷至根節點(參考一下樹型圖)              
   2  3 
  MASTER   SUB       SALES      
  ---------- ---------- ----------      
  主2    主4         5  --這條是自己本身,也就是第一遍遍歷
  主1    主2        15  --這是第2次遍歷,我們從樹型圖可以看到,'主2'往上遍歷是'主1'     
  主2    主5        10      
  主1    主2        15      
                        
                         
                        
  好,我們關看上面可能還是不好理解,我們加入一個樹結構專用函數sys_connect_by_path,便于理解
  
  SQL> select sys_connect_by_path(MASTER,'/') from tree  --master表示我遍歷的起點只找在master列中存在的,如下例只要'主2'為起點,并以/為分割符
  start with master='主2'
  connect by prior master=sub;  --往根節點遍歷
   2  3 
  SYS_CONNECT_BY_PATH(MASTER,'/')
  --------------------------------------------------------------------------------
  /主2             --第1遍遍歷
  /主2/主1          --第2遍遍歷
  /主2             --第2條master='主2'的記錄的第1次遍歷
  /主2/主1          --第2條master='主2'的記錄的第2次遍歷
  
  SQL> select sys_connect_by_path(MASTER,'/') from tree --起點為sub='主5'時MASTER=主2,主3
  start with sub='主5'
  connect by prior master=sub;
   2  3 
  SYS_CONNECT_BY_PATH(MASTER,'/')
  --------------------------------------------------------------------------------
  /主2
  /主2/主1
  /主3
  /主3/主1
  
  SQL> select sys_connect_by_path(MASTER,'/'),sub,master from tree  
  start with sub is not null
  connect by prior master=sub; 
   2  3 
  SYS_CONNECT_BY_PATH(MASTER,'/' SUB    MASTER
  ------------------------------ ---------- ----------
  /主1              主2    主1 --找主1到根的路徑,這里根是主1他自己
  /主1              主3    主1 
  /主2              主4    主2 
  /主2/主1           主2    主1 --找主2到根的路徑,這里根是主1
  /主2              主5    主2
  /主2/主1           主2    主1 
  /主3              主5    主3 
  /主3/主1           主3    主1
  /主3              主6    主3
  /主3/主1           主3    主1  
  select sys_connect_by_path(MASTER,'/'),sub,master from tree                
  start with sub is not null
  connect by prior sub = master;
                       
  
  SYS_CONNECT_BY_PATH(MASTER,'/' SUB    MASTER
  ------------------------------ ---------- ----------
  /主1              主2    主1
  /主1/主2           主4    主2
  /主1/主2           主5    主2
  /主1              主3    主1
  /主1/主3           主5    主3
  /主1/主3           主6    主3
  /主2              主4    主2
  /主2              主5    主2
  /主3              主5    主3
  /主3              主6    主3

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 罗平县| 吉林市| 大兴区| 谷城县| 延川县| 宜丰县| 金寨县| 桃江县| 桓台县| 临安市| 华池县| 霍邱县| 隆安县| 高清| 肇州县| 麻城市| 双江| 石柱| 彭山县| 神农架林区| 满洲里市| 唐海县| 富锦市| 连平县| 建宁县| 沙河市| 河津市| 屏南县| 旬阳县| 盐山县| 黔南| 海门市| 北安市| 乐亭县| 库尔勒市| 山东| 资中县| 丹东市| 宁强县| 海淀区| 塘沽区|