2012-06-21 14 views
10

Supongamos que tenemos tablas siguientesConnect en 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 ) 

y

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

Estoy interesado en lo que hace la consulta a continuación

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

Según entendí este código selecciona empno, manager_id, ename del empleado, comienza la selección f rom esta fila donde empno=1, pero no podía entender lo que hace esta línea:

CONNECT BY PRIOR empno = manager_id; 

¿Es esto lo mismo que:

where empno=manager_id? 
+2

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

Respuesta

8
CONNECT BY PRIOR empno = manager_id; 

Esto producirá la recursividad. Todos los registros que son parte del siguiente nivel jerárquico inferior volverán. Esto devolverá una jerarquía de arriba a abajo para todos los administradores y sus respectivos subordinados que trabajan.

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

así que ¿cómo puedo adivinar si necesito código como este para seleccionar algo? –

+1

Simplemente cuando quiera obtener algo que tenga una relación padre-hijo de manera jerárquica. – manurajhada

3

La consulta es recursivo, que parten de los empleados # 1 (CEO probablemente) y luego imprime recursivamente a todos sus subordinados y luego a todos sus subordinados, y así sucesivamente (hasta que se impriman todos los empleados).

Una buena explicación acerca de la "comenzar, y CONECTAR POR" se puede encontrar here