国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

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

2006.09.12

關注
深入了解 Oracle 10g 中新型層次查詢選項
Scott Stephens
9/8/2005
URL: http://www.zdnet.com.cn/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ā)現有害或侵權內容,請點擊舉報。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
oracle之sys_connect_by_path(行轉列挺好用的) - lky5387...
數據庫學習筆記
ASIA Pacific will surpass North America in e-commerce spending
Mapcarta---地圖
美麗的蜂鳥(2)
參考網絡自制的gps.conf文件,HTC G12凱立德秒搜秒定!
更多類似文章 >>
生活服務
分享 收藏 導長圖 關注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點擊這里聯系客服!

聯系客服