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

首頁 > 數(shù)據(jù)庫 > Oracle > 正文

深入了解Oracle 10g新型層次查詢選項(xiàng)

2024-08-29 13:37:43
字體:
供稿:網(wǎng)友

  我們可以通過START WITH . . . CONNECT BY . . .子句來實(shí)現(xiàn)SQL的 層次查詢,而Oracle 10g 為其添加許多了新的偽列。十多年以來,Oracle SQL 具有依照層次關(guān)系進(jìn)行查詢的功能。例如,你可以指定一個(gè)起始條件,然后根據(jù)一個(gè)或多個(gè)連接條件來確定孩子行的內(nèi)容。 舉例來說,現(xiàn)在假設(shè)我有一個(gè)表,里面記錄了世界上的某些地區(qū),其表結(jié)構(gòu)如下:
  
  create table hier
  (
  parent varchar2(30),
  child varchar2(30)
  );
  
  insert into hier values(null,'Asia');
  insert into hier values(null,'Australia');
  insert into hier values(null,'Europe');
  insert into hier values(null,'North America');
  insert into hier values('Asia','China');
  insert into hier values('Asia','Japan');
  insert into hier values('Australia','New South Wales');
  insert into hier values('New South Wales','Sydney');
  insert into hier values('California','Redwood Shores');
  insert into hier values('Canada','Ontario');
  insert into hier values('China','Beijing');
  insert into hier values('England','London');
  insert into hier values('Europe','United Kingdom');
  insert into hier values('Japan','Osaka');
  insert into hier values('Japan','Tokyo');
  insert into hier values('North America','Canada');
  insert into hier values('North America','USA');
  insert into hier values('Ontario','Ottawa');
  insert into hier values('Ontario','Toronto');
  insert into hier values('USA','California');
  insert into hier values('United Kingdom','England');
  
  那么我們可以使用START WITH . . . CONNECT BY . . .從句將父級地區(qū)與孩子地區(qū)連接起來,并將其層次等級顯示出來。
  
  column child format a40
  select level,lpad(' ',level*3)child child
  from hier
  start with parent is null
  connect by PRior child = parent;
  
  LEVEL CHILD
  ---------- --------------------------
  1 Asia
  2 China
  3 Beijing
  2 Japan
  3 Osaka
  3 Tokyo
  1 Australia
  2 New South Wales
  3 Sydney
  1 Europe
  2 United Kingdom
  3 England
  4 London
  1 North America
  2 Canada
  3 Ontario
  4 Ottawa
  4 Toronto
  2 USA
  3 California
  4 Redwood Shores
  
  自從Since Oracle 9i 開始,就可以通過 SYS_CONNECT_BY_PATH 函數(shù)實(shí)現(xiàn)將從父節(jié)點(diǎn)到當(dāng)前行內(nèi)容以“path”或者層次元素列表的形式顯示出來。 如下例所示:
  
  column path format a50
  select level,sys_connect_by_path(child,'/') path
  from hier
  start with parent is null
  connect by prior child = parent;
  
  LEVEL PATH
  -------- --------------------------------------------
  1 /Asia
  2 /Asia/China
  3 /Asia/China/Beijing
  2 /Asia/Japan
  3 /Asia/Japan/Osaka
  3 /Asia/Japan/Tokyo
  1 /Australia
  2 /Australia/New South Wales
  3 /Australia/New South Wales/Sydney
  1 /Europe
  2 /Europe/United Kingdom
  3 /Europe/United Kingdom/England
  4 /Europe/United Kingdom/England/London
  1 /North America
  2 /North America/Canada
  3 /North America/Canada/Ontario
  4 /North America/Canada/Ontario/Ottawa
  4 /North America/Canada/Ontario/Toronto
  2 /North America/USA
  3 /North America/USA/California
  4 /North America/USA/California/Redwood Shores
  
  在 Oracle 10g 中,還有其他更多關(guān)于層次查詢的新特性 。
例如,有的時(shí)候用戶更關(guān)心的是每個(gè)層次分支中等級最低的內(nèi)容。那么你就可以利用偽列函數(shù)CONNECT_BY_ISLEAF來判定當(dāng)前行是不是葉子。假如是葉子就會(huì)在偽列中顯示“1”,假如不是葉子而是一個(gè)分支(例如當(dāng)前內(nèi)容是其他行的父親)就顯示“0”。下給出了一個(gè)關(guān)于這個(gè)函數(shù)使用的例子:
  
  select connect_by_isleaf,sys_connect_by_path(child,'/') path
  from hier
  start with parent is null
  connect by prior child = parent;
  
  CONNECT_BY_ISLEAF PATH
  ---------------------------------- ------------
  0 /Asia
  0 /Asia/China
  1 /Asia/China/Beijing
  0 /Asia/Japan
  1 /Asia/Japan/Osaka
  1 /Asia/Japan/Tokyo
  0 /Australia
  0 /Australia/New South Wales
  1 /Australia/New South Wales/Sydney
  0 /Europe
  0 /Europe/United Kingdom
  0 /Europe/United Kingdom/England
  1 /Europe/United Kingdom/England/London
  0 /North America
  0 /North America/Canada
  0 /North America/Canada/Ontario
  1 /North America/Canada/Ontario/Ottawa
  1 /North America/Canada/Ontario/Toronto
  0 /North America/USA
  0 /North America/USA/California
  1 /North America/USA/California/Redwood Shores
  
  在Oracle 10g 中還有一個(gè)新操作——CONNECT_BY_ROOT。 它用在列名之前用于返回當(dāng)前層的根節(jié)點(diǎn)。如下面的例子,我可以顯示出層次結(jié)構(gòu)表中當(dāng)前行數(shù)據(jù)所對應(yīng)的最高等級節(jié)點(diǎn)的內(nèi)容。
  
  select connect_by_root child,sys_connect_by_path(child,'/') path
  from hier
  start with parent is null
  connect by prior child = parent;
  
  CONNECT_BY_ROOT PATH
  ------------------------------ --------
  Asia /Asia
  Asia /Asia/China
  Asia /Asia/China/Beijing
  Asia /Asia/Japan
  Asia /Asia/Japan/Osaka
  Asia /Asia/Japan/Tokyo
  Australia /Australia
  Australia /Australia/New South Wales
  Australia /Australia/New South Wales/Sydney
  Europe /Europe
  Europe /Europe/United Kingdom
  Europe /Europe/United Kingdom/England
  Europe /Europe/United Kingdom/England/London
  North America /North America
  North America /North America/Canada
  North America /North America/Canada/Ontario
  North America /North America/Canada/Ontario/Ottawa
  North America /North America/Canada/Ontario/Toronto
  North America /North America/USA
  North America /North America/USA/California
  North America /North America/USA/California/Redwood Shores
  
  在Oracle 10g 之前的版本中,假如在你的樹中出現(xiàn)了環(huán)狀循環(huán)(如一個(gè)孩子節(jié)點(diǎn)引用一個(gè)父親節(jié)點(diǎn)),Oracle 就會(huì)報(bào)出一個(gè)錯(cuò)誤提示:“ ORA-01436: CONNECT BY loop in user data”。假如不刪掉對父親的引用就無法執(zhí)行查詢操作。而在 Oracle 10g 中,只要指定“NOCYCLE”就可以進(jìn)行任意的查詢操作。與這個(gè)要害字相關(guān)的還有一個(gè)偽列——CONNECT_BY_ISCYCLE, 假如在當(dāng)前行中引用了某個(gè)父親節(jié)點(diǎn)的內(nèi)容并在樹中出現(xiàn)了循環(huán),那么該行的偽列中就會(huì)顯示“1”,否則就顯示“0”。如下例所示:
  
  create table hier2
  (
  parent number,
  child number
  );
  
  insert into hier2 values(null,1);
  insert into hier2 values(1,2);
  insert into hier2 values(2,3);
  insert into hier2 values(3,1);
  
  select connect_by_iscycle,sys_connect_by_path(child,'/') path
  from hier2
  start with parent is null
  connect by nocycle prior child = parent;

  
  CONNECT_BY_ISCYCLE PATH
  ------------------ -------
  0 /1
  0 /1/2
  1 /1/2/3

發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 华坪县| 喜德县| 保亭| 万盛区| 芒康县| 临汾市| 西宁市| 伽师县| 龙陵县| 延津县| 温宿县| 榆树市| 安岳县| 太和县| 威信县| 类乌齐县| 佳木斯市| 潜江市| 襄樊市| 延津县| 凌云县| 苍梧县| 清原| 三门峡市| 海城市| 云林县| 湖南省| 喀喇沁旗| 聊城市| 金堂县| 大兴区| 淮北市| 永城市| 若尔盖县| 灵寿县| 南召县| 玉田县| 阳东县| 拜泉县| 麻江县| 五常市|