乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      Builder.com.cn : 打印保留 - 深入了解 Oracle 10g 中新型層次查詢選項

       bez 2006-09-12
      深入了解 Oracle 10g 中新型層次查詢選項
      Scott Stephens
      9/8/2005
      URL: http://www./developer/database/story/0,3800066906,39401406,00.htm

      我們可以通過START WITH . . . CONNECT BY . . .子句來實現SQL的 層次查詢,而Oracle 10g 為其添加許多了新的偽列。十多年以來,Oracle SQL 具有依照層次關系進行查詢的功能。例如,你可以指定一個起始條件,然后根據一個或多個連接條件來確定孩子行的內容。舉例來說,現在假設我有一個表,里面記錄了世界上的某些地區(qū),其表結構如下:

      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 函數實現將從父節(jié)點到當前行內容以“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 中,還有其他更多關于層次查詢的新特性 。例如,有的時候用戶更關心的是每個層次分支中等級最低的內容。那么你就可以利用偽列函數CONNECT_BY_ISLEAF來判斷當前行是不是葉子。如果是葉子就會在偽列中顯示“1”,如果不是葉子而是一個分支(例如當前內容是其他行的父親)就顯示“0”。下給出了一個關于這個函數使用的例子:

      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 中還有一個新操作——CONNECT_BY_ROOT。 它用在列名之前用于返回當前層的根節(jié)點。如下面的例子,我可以顯示出層次結構表中當前行數據所對應的最高等級節(jié)點的內容。

      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 之前的版本中,如果在你的樹中出現了環(huán)狀循環(huán)(如一個孩子節(jié)點引用一個父親節(jié)點),Oracle 就會報出一個錯誤提示:“ ORA-01436: CONNECT BY loop in user data”。如果不刪掉對父親的引用就無法執(zhí)行查詢操作。而在 Oracle 10g 中,只要指定“NOCYCLE”就可以進行任意的查詢操作。與這個關鍵字相關的還有一個偽列——CONNECT_BY_ISCYCLE, 如果在當前行中引用了某個父親節(jié)點的內容并在樹中出現了循環(huán),那么該行的偽列中就會顯示“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ā)布,不代表本站觀點。請注意甄別內容中的聯系方式、誘導購買等信息,謹防詐騙。如發(fā)現有害或侵權內容,請點擊一鍵舉報。
        轉藏 分享 獻花(0

        0條評論

        發(fā)表

        請遵守用戶 評論公約

        類似文章 更多