成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Oracle Handbook系列之結構化查詢

數據庫 Oracle
這是這個系列的開篇之作,主要從結構化查詢角度出發講述Oracle的使用,本系列的其它文章會陸續錄入,敬請期待...

一)準備測試數據

閑話少說,直入正題。建立一張簡單的職工表 t_hierarchical:

  • Emp 職工編號
  • Mgr 職工的直接上司(Mgr本身也是職工)
  • Emp_name 職工姓名

插入一些測試數據,除了大老板AA,其它的職工都各有自己的Manager。

  1. select emp, mgr, emp_name from t_hierarchical t;
  1. 1            AA 
  2. 2     1     BB 
  3. 3     2     CC 
  4. 4     3     DD 
  5. 5     2     EE 
  6. 6     3     FF 

二)CONNECT BY

  1. select emp, mgr, LEVEL from t_hierarchical t 
  2. CONNECT BY PRIOR emp=mgr 
  3. order by emp; 
  4.  
  5. 1           1 
  6. 2     1     2 
  7. 2     1     1 
  8. 3     2     1 
  9. 3     2     3 
  10. 3     2     2 
  11. 4     3     4 
  12. 4     3     1 
  13. 4     3     2 
  14. 4     3     3 
  15. 5     2     3 
  16. 5     2     2 
  17. 5     2     1 
  18. 6     3     2 
  19. 6     3     3 
  20. 6     3     4 
  21. 6     3     1 

解釋一下,CONNECT BY用于指定 父-子 記錄的關系(PRIOR我們在下例中解釋,更直觀一些)。舉emp 2為例,他隸屬于emp 1,如果我們以emp 1為根節點,顯然LEVEL=2;以emp 2自身為根節點,則LEVEL=1,這就是為什么上述查詢結果中出現共色標識部分那兩行記錄,其它的類推。

三)START WITH

通常我們需要更直觀、更具有實用性的結果,這需要用到結構化查詢中的START WITH子句,用于指定根節點:

  1. select emp, mgr, LEVEL from t_hierarchical t 
  2. START WITH emp=1 
  3. CONNECT BY PRIOR emp=mgr; 
  4.  
  5. 1           1 
  6. 2     1     2 
  7. 3     2     3 
  8. 4     3     4 
  9. 6     3     4 
  10. 5         3 

這里我們指定了根節點是emp 1,這樣的結果直觀了許多,例如,以emp 1為根節點,那么emp 3位于第三級(emp 1—emp 2—emp 3),這里補充一下 PRIOR 關鍵字的說明,個人觀點:“PRIOR emp=mgr”表示前一條記錄的emp編號 = 當前記錄的mgr編號,從查詢結果中可以看出這一點。同時,從查詢結果中還能發現明顯的 遞歸 痕跡,參見不同顏色標識的數字。

四)SYS_CONNECT_BY_PATH()

不得不介紹一下非常牛波依的SYS_CONNECT_BY_PATH()函數,我們可以得到層次結構或者說樹狀結構的 路徑, 參見如下:

  1. select emp, mgr, LEVEL, SYS_CONNECT_BY_PATH(emp,'/') path from t_hierarchical t 
  2. START WITH emp=1 
  3. CONNECT BY PRIOR emp=mgr; 
  4.  
  5. 1            1     /1 
  6. 2     1     2     /1/2 
  7. 3     2     3     /1/2/3 
  8. 4     3     4     /1/2/3/4 
  9. 6     3     4     /1/2/3/6 
  10. 5     2     3     /1/2/5 

五)CONNECT_BY_ISLEAF

非常好用的CONNECT_BY_ISLEAF虛列。何謂LEAF(葉子),即沒有任何節點隸屬于該節點:

  1. select emp, mgr, LEVEL, SYS_CONNECT_BY_PATH(emp,'/') path from t_hierarchical t 
  2. where CONNECT_BY_ISLEAF=1 
  3. START WITH emp=1 
  4. CONNECT BY PRIOR emp=mgr; 
  5.  
  6. 4     3     4     /1/2/3/4 
  7. 6     3     4     /1/2/3/6 
  8. 5     2     3     /1/2/5 

#p#

六)CONNECT BY與WHERE子句

下面再說說,關于引入結構化查詢后,SQL語句的執行順序問題,根據Oracle文檔,先后是:

1)JOIN,無論用的是JOIN ON的寫法,還是在WHERE中做的關聯

2)CONNECT BY

3)其它的WHERE條件

看一個例子,假設上面的各位職工,需要保存一些注釋信息,同時這些信息根據中文、英文分成兩個不同版本,我們可以簡單設計一下這個注釋表:

  1. |-Emp 職工編號 
  2. |-Lang 語言(中文或英文) 
  3. |-Emp_desc 職工的具體描述 
  4.  
  5. select emp, lang, emp_desc from t_desc; 
  6.  
  7. 1     chinese 這是注釋 
  8. 1     english   this is comment 
  9. 2     chinese 這是注釋 
  10. 2     english   this is comment 
  11. 3     chinese 這是注釋 
  12. 3     english   this is comment 
  13. 4     chinese 這是注釋 
  14. 4     english   this is comment 
  15. 5     chinese 這是注釋 
  16. 5     english   this is comment 
  17. 6     chinese 這是注釋 
  18. 6     english   this is comment 

現在需要在原有的職工結構化查詢中包括每個職工的中文注釋信息,我們看看下面的查詢:

  1. select t.emp, t.mgr, td.emp_desc, LEVEL 
  2. from t_hierarchical t, t_desc td 
  3. where t.emp=td.emp and td.lang='chinese' 
  4. START WITH t.emp=1 
  5. CONNECT BY PRIOR t.emp=t.mgr; 
  6.  
  7. 1            chinese 這是注釋 1 
  8. 2     1     chinese 這是注釋 2 
  9. 3     2     chinese 這是注釋 3 
  10. 4     3     chinese 這是注釋 4 
  11. 6     3     chinese 這是注釋 4 
  12. 4     3     chinese 這是注釋 4 
  13. 6     3     chinese 這是注釋 4 
  14. 5     2     chinese 這是注釋 3 
  15. 3     2     chinese 這是注釋 3 
  16. 4     3     chinese 這是注釋 4 
  17. 6     3     chinese 這是注釋 4 
  18. 4     3     chinese 這是注釋 4 
  19. 6     3     chinese 這是注釋 4 
  20. 5     2     chinese 這是注釋 3 
  21. 2     1     chinese 這是注釋 2 
  22. 3     2     chinese 這是注釋 3 
  23. 4     3     chinese 這是注釋 4 
  24. 6     3     chinese 這是注釋 4 
  25. 4     3     chinese 這是注釋 4 
  26. 6     3     chinese 這是注釋 4 
  27. 5     2     chinese 這是注釋 3 
  28. 3     2     chinese 這是注釋 3 
  29. 4     3     chinese 這是注釋 4 
  30. 6     3     chinese 這是注釋 4 
  31. 4     3     chinese 這是注釋 4 
  32. 6     3     chinese 這是注釋 4 
  33. 5     2     chinese 這是注釋 3 

再看這個查詢,看起來與前者是一樣的:

  1. select t.emp, t.mgr, td.emp_desc, LEVEL 
  2. from t_hierarchical t join t_desc td 
  3. on (t.emp=td.emp and td.lang='chinese'
  4. START WITH t.emp=1 
  5. CONNECT BY PRIOR t.emp=t.mgr; 
  6.  
  7. 1            這是注釋 1 
  8. 2     1     這是注釋 2 
  9. 3     2     這是注釋 3 
  10. 4     3     這是注釋 4 
  11. 6     3     這是注釋 4 
  12. 5     2     這是注釋 3 

第二個是我們期望的結果,第二個則相去甚遠。追究原因,是因為前一個例子中第二個條件 td.lang=’chinese’不被認為是JOIN條件,所以在CONNECT BY之后執行;后一個例子中由于顯式地把第二個條件寫在了JOIN ON子句中,所以它在CONNECT BY之前執行。

由于缺少第二個條件的JOIN(即本節***例)會導致每個的職工出現兩次,換一個數據少一點的例子,看看CONNECT BY遇到這樣的重復數據的時候是怎么處理的。

  1. select emp, mgr, lang from t2; 
  2.  
  3. 1            chinese 
  4. 1            english 
  5. 2     1     chinese 
  6. 2     1     english 

CONNECT BY之后:

  1. select emp, mgr, lang from t2 
  2. start with emp=1 
  3. connect by prior emp=mgr; 
  4.  
  5. 1            chinese 
  6. 2     1     chinese 
  7. 2     1     english 
  8. 1            english 
  9. 2     1     chinese 
  10. 2     1     english 

lang=’chinese’過濾之后:

  1. 1            chinese 
  2. 2     1     chinese 
  3. 2     1     chinese 

出現重復行,顯然不是我們期望的結果。

七)CONNECT BY LEVEL

下面我再來看看一個特殊的用法 CONNECT BY LEVEL,這是一個理解起來令人頭痛,但同時在某些情境下又是非常有用的:

  1. select LEVEL from dual CONNECT BY LEVEL<=6; 
  2.  

如果你以前從未使用過,但是不幸你猜中了結果,我深表佩服,我至今沒有想通,事實上,它甚至不太符合結構化查詢CONNECT BY的語法,因為根據Oracle文檔,CONNECT BY條件中至少有一個表達式要使用PRIOR關鍵字。 以至于有人覺得CONNECT BY LEVEL是一個BUG,懷疑Oracle可能在后續的版本中加以糾正。

無論如何,CONNECT BY LEVEL在Oracle 10g/11g中運行良好,如果你不想費勁想通這其中的原由,可以簡單地把想認為是構造了一個循環,因此如果你寫成CONNECT BY 1=1,則會輸出1到無窮大的數。

原文鏈接:http://www.cnblogs.com/KissKnife/archive/2011/02/25/1964816.html

 

【編輯推薦】

  1. SQL Server 2008 R2 SP1正式版發布
  2. Facebook對MySQL依賴的后果將是“比死還糟”
  3. 土法炮制數據庫 家譜網幫你查祖宗
  4. 大數據時代已來臨,你準備好了嗎?

 

 

 

 

 

責任編輯:艾婧 來源: 側身向南邊的博客
相關推薦

2010-04-02 10:04:21

Oracle結構

2011-08-24 09:56:07

Oracle hand虛擬專用數據庫VPD

2018-04-03 14:00:03

結構化數據非結構化數據數據庫

2021-12-12 08:37:18

結構化數據非結構化數據數據

2023-12-25 15:00:18

結構化布線光纖

2024-05-27 00:32:45

2016-10-19 09:41:31

SQL查詢語言關系型

2012-10-11 17:05:41

IBMdw

2012-02-08 15:54:05

ibmdw

2009-10-16 12:55:27

結構化布線系統

2011-03-01 09:39:51

結構化布線

2023-07-25 17:21:20

綜合布線結構化布線

2009-10-15 13:49:23

結構化布線系統

2009-10-21 15:20:28

結構化布線技術

2022-07-04 22:08:52

結構化數據谷歌

2010-04-21 16:55:06

Oracle物理存儲結

2023-01-06 08:00:00

關系數據庫數據庫機器學習

2011-07-22 13:06:00

結構化布線系統進水

2009-10-09 17:57:20

結構化布線

2011-02-28 13:55:00

結構化布線
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 日韩在线免费视频 | 欧美一级二级视频 | 亚洲成人一区二区 | 久久久国产一区二区三区 | 凹凸日日摸日日碰夜夜 | 国内精品一区二区 | 狠狠爱综合 | 精品视频在线观看 | 亚州午夜精品 | 亚洲天堂色 | 在线观看成人免费视频 | 日韩中字幕 | 色呦呦网站 | 97国产精品 | 国产精品欧美一区二区三区不卡 | 黄色毛片在线看 | 99九色 | 国产精品成人一区 | 大乳boobs巨大吃奶挤奶 | 久久精品色视频 | 日韩久久久久 | 亚洲国产成人av | 亚洲97 | 久久夜视频 | 国产美女精品 | 成人片免费看 | 国产精品一区二区久久精品爱微奶 | 国产成人在线免费 | 亚洲精品一区二三区不卡 | 亚洲一区二区三区四区五区午夜 | 精品欧美乱码久久久久久 | 国产精品亚洲成在人线 | 欧区一欧区二欧区三免费 | 四虎午夜剧场 | 亚洲一区免费 | 国产在线观看 | 日本成人免费网站 | 成年人在线播放 | 久久综合久 | 国产成人精品免高潮在线观看 | 色在线视频网站 |