2012-06-21 16 views
10

Supponiamo di avere tabelle seguenticonnettersi in Oracle 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 ) 

e

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

Sono interessato a ciò che la domanda sotto fa

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

Come ho capito questo codice seleziona empno, manager_id, ename dal dipendente, inizia la selezione f rom questa riga in cui empno=1, ma non riusciva a capire che cosa questa linea fa:

CONNECT BY PRIOR empno = manager_id; 

questo è lo stesso:

where empno=manager_id? 
+2

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

risposta

8
CONNECT BY PRIOR empno = manager_id; 

Questo produrrà la ricorsione. Verranno restituiti tutti i record che fanno parte del successivo livello gerarchico inferiore. Ciò restituirà una gerarchia dall'alto verso il basso per tutti i gestori e i loro rispettivi sotto subordinati di lavoro.

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

Così come posso indovinare se ho bisogno di codice come questo per selezionare qualcosa? –

+1

Semplicemente quando vuoi ottenere qualcosa che abbia una relazione genitore-figlio in modo gerarchico. – manurajhada

3

La query è ricorsiva, che partono da dipendente # 1 (CEO probabilmente) e poi stampa in modo ricorsivo tutti i suoi subordinati e poi tutti i loro subordinati e così via e così via (fino a quando tutti gli impiegati non sono stampati).

Una buona spiegazione sulla "iniziare e connettersi" si possono trovare here