Perché devo ricorrere alla ricorsione sulla classica relazione tra database di manager dipendenti?

1

Prendi i dati dal database di Oracle Scott. L'ho modificato per avere più livelli di gestione dall'originale,

select * from scott.emp order by mgr desc;

empno       ename  job        mgr   hiredate   sal   comm   deptno

7839    KING    PRESIDENT       11-17-1981  5000        10
7369    SMITH   CLERK   7902    12-17-1980  800     20
7900    JAMES   CLERK   7844    12-03-1981  950     30
7654    MARTIN  SALESMAN    7844    09-28-1981  1250    1400    30
7698    BLAKE   MANAGER 7839    05-01-1981  2850        30
7566    JONES   MANAGER 7839    04-02-1981  2975        20
7782    CLARK   MANAGER 7839    06-09-1981  2450        10
7876    ADAMS   CLERK   7788    05-23-1987  1100        20
7934    MILLER  CLERK   7782    01-23-1982  1300        10
7521    WARD    SALESMAN    7698    02-22-1981  1250    500 30
7844    TURNER  SALESMAN    7698    09-08-1981  1500    0   30
7499    ALLEN   SALESMAN    7698    02-20-1981  1600    300 30
7788    SCOTT   ANALYST 7654    04-19-1987  3000        20
7902    FORD    ANALYST 7566    12-03-1981  3000        20

Se voglio sapere chi è il cui responsabile,

select 
  E.EMPNO, E.ENAME, E.job, E.MGR,
   M.EMPNO, M.ENAME, M.job, M.MGR
from SCOTT.EMP E, SCOTT.EMP M
where E.MGR = M.EMPNO
order by M.mgr desc;

7698    BLAKE   MANAGER 7839    7839    KING    PRESIDENT   
7566    JONES   MANAGER 7839    7839    KING    PRESIDENT   
7782    CLARK   MANAGER 7839    7839    KING    PRESIDENT   
7788    SCOTT   ANALYST 7654    7654    MARTIN  SALESMAN    7844
7499    ALLEN   SALESMAN    7698    7698    BLAKE   MANAGER 7839
7521    WARD    SALESMAN    7698    7698    BLAKE   MANAGER 7839
7844    TURNER  SALESMAN    7698    7698    BLAKE   MANAGER 7839
7902    FORD    ANALYST 7566    7566    JONES   MANAGER 7839
7934    MILLER  CLERK   7782    7782    CLARK   MANAGER 7839
7900    JAMES   CLERK   7844    7844    TURNER  SALESMAN    7698
7654    MARTIN  SALESMAN    7844    7844    TURNER  SALESMAN    7698
7876    ADAMS   CLERK   7788    7788    SCOTT   ANALYST 7654
7369    SMITH   CLERK   7902    7902    FORD    ANALYST 7566

Posso vederlo,

73609 (smith) ha un manager 7902 (ford) che ha un manager 7566 (jones) che ha un manager 7839 (presidente, null mgr).

Perché dovrei usare la ricorsione qui come vedo con così tante espressioni comuni della tabella? È solo per motivi di visualizzazione?

    
posta johnny 27.08.2015 - 19:11
fonte

1 risposta

6

Se ti interessano solo i report diretti, non è necessario ricorrere a ricorsione. Ogni dipendente (eccetto il CEO) riporta esattamente a un manager.

Se vuoi conoscere i rapporti indiretti e , hai bisogno di una ricorsione. Questo risponderebbe alla domanda "chi sono tutti i rapporti di questo regista, inclusi manager, supervisori e peones". Potrebbe non essere nella stessa granularità del reparto, che è nella tua tabella. Devi cercare i rapporti diretti del direttore, quindi interrogare i rapporti diretti di quei dipendenti e recedere finché nessuno non fa rapporto agli impiegati che hai appena recuperato.

SQL non è intrinsecamente un linguaggio ricorsivo. SQL standard non ha avuto ricorsione per molti anni perché è modellato male dal calcolo relazionale sottostante. Tuttavia, Common Table Expressions (CTE) sono stati aggiunti in SQL: 1999 . Sebbene non siano generalmente utili, sono molto utili in alcune nicchie.

Quasi tutti i database di classe Enterprise come SQL Server e Oracle hanno aggiunto query ricorsive, ma alcuni database più piccoli come MySQL sono in ritardo rispetto allo standard.

    
risposta data 27.08.2015 - 19:33
fonte

Leggi altre domande sui tag