2012-06-21 107 views
10

假設我們有如下表在甲骨文的SQL連接通過

create table Employee(
    2 EMPNO   NUMBER(3), 
    3 ENAME   VARCHAR2(15 BYTE), 
    4 HIREDATE  DATE, 
    5 ORIG_SALARY NUMBER(6), 
    6 CURR_SALARY NUMBER(6), 
    7 REGION  VARCHAR2(1 BYTE), 
    8 MANAGER_ID NUMBER(3) 
    9 ) 

create table job (
    2 EMPNO   NUMBER(3), 
    3 jobtitle  VARCHAR2(20 BYTE) 
    4 ) 
    5/

我很感興趣,下面的查詢會

SELECT empno, manager_id, ename 
    2 FROM employee 
    3 START WITH empno = 1 
    4 CONNECT BY PRIOR empno = manager_id; 

什麼我的理解這個代碼從僱員中選擇empnomanager_idename,它開始選擇f ROM此行其中empno=1,但不明白這行做:

CONNECT BY PRIOR empno = manager_id; 

這是一樣的:

where empno=manager_id? 
+2

[文件](http://docs.oracle.com/cd/B19306_01/server.102/b14200/queries003.htm) – turbanoff

回答

8
CONNECT BY PRIOR empno = manager_id; 

這將產生遞歸。所有屬於下一個較低等級的記錄都將返回。這將爲所有管理人員及其下屬的工作下屬返回一個從上到下的層次結構。

30 (manager_id) 
    12 
    5 (manager_id) 
     1 
     7 
20 (manager_id) 
    15 
    10 
+1

所以,我怎麼能猜如果我需要這樣的代碼來選擇的東西嗎? –

+1

簡單地說,當你想要以分層方式得到具有父子關係的東西時。 – manurajhada

3

查詢是遞歸的,它從員工#開始1(CEO可能)然後遞歸地打印他的所有下屬,然後遞歸打印所有下屬等等(直到所有員工都打印完畢)。

有關 「START WITH和CONNECT BY」 一個很好的解釋可以發現here