Sunteți pe pagina 1din 11

SQL, ierarhii și recursivitate

Curs

1
Autojoncțiuni și subconsultări
 SELECT * FROM employees e1 INNER
JOIN employees e2 ON
e1.manager_id=e2.employee_id;
 e1- este legat de subordonat;
 e2- este legat de șef;
 SELECT * FROM employees subordonat
INNER JOIN employees sef ON
subordonat.manager_id=sef.employee_i
d WHERE sef.first_name=‘Brian’;
2
Autojoncțiuni și subconsultări
 Echivalent:
 SELECT * FROM employees WHERE
manager_id IN (SELECT employee_id FROM
employees WHERE first_name=‘Brian’);
 Câți subordonați are fiecare angajat al
firmei?
 SELECT sef.first_name, COUNT(*) AS numar
FROM employees subordonat INNER JOIN
employees sef ON
subordonat.manager_id=sef.employee_id
GROUP BY sef.first_name;

3
Autojoncțiuni și subconsultări
 Care sunt subordonații subordonaților
managerului general?
 Varianta 1- joncțiuni
 SELECT subordonat.employee_id,
subordonat.first_name,
subordonat.department_id FROM employees
subordonat INNER JOIN employees sef1 ON
subordonat.manager_id=sef1.employee_id
INNER JOIN employees sef2 ON
sef1.manager_id=sef2.employee_id WHERE
sef2.manager_id IS NULL

4
Autojoncțiuni și subconsultări
 Care sunt subordonații subordonaților
managerului general?
 Varianta 2- Subconsultări
 SELECT employee_id, first_name,
department_id FROM employees WHERE
manager_id IN( SELECT employee_id
FROM employees WHERE manager_id
IN( SELECT employee_id FROM
employees WHERE manager_id IS
NULL))

5
Autojoncțiuni și subconsultări
 Care este nivelul ierarhic al fiecărui
salariat??
 O interogare ce se poate realiza într-un
timp rezonabil, însă, se pot preciza, încă
din start două probleme:
 Trebuie să știm, aprioric, numărul nivelelor
ierarhice din cadrul problemei studiate
(lucru care nu este la îndemână tot timpul);
 La un număr mare de nivele, întinderea
textului interogării crește destul de mult
(astfel încât, la un moment dat, putem
recurge la renunțarea obținerii rezultatului
dorit).
6
Interogări arborescente în
Oracle
 Care este nivelul ierarhic al fiecărui
salariat?
 SELECT employees.*, LEVEL FROM employees
START WITH manager_id IS NULL CONNECT BY
PRIOR employee_id=manager_id;
 Construcția structurii ierarhice începe cu
înregistrarea care îndeplinește condiția din
clauza START WITH. Această înregistrare-părinte
(care este, de fapt, rădăcina întregii structuri) va
fi legată de înregistrarile-copil prin condiția din
CONNECT BY PRIOR employee_id=manage_id.
La rândul lor aceste înregistrări-copil pot deveni
înregistrări-părinte pentru alte înregistrări.
7
Interogări arborescente în
Oracle
 CONNECT BY ajută la selectarea
tuturor generațiilor succesive de linii
copil (copii, nepoți, strănepoți);
 Clauza PRIOR plasată la stânga
condiției semnifică: valoarea
atributului employee_id din părinte
trebuie să fie egală cu valoarea
manager_id din înregistrările copil,
ș.a.m.d.;
8
Interogări arborescente în
Oracle
 Pseudocoloana LEVEL- semnifică
nivelul ierarhiei, raportat la
înregistrarea care îndeplinește
condiția din START WITH;
 Restricții: SELECT-ul care execută o
interogare ierarhică nu poate efectua
o joncțiune și nici nu poate extrage
datele dintr-o tabelă virtuală creată
printr-o joncțiune;
9
Interogări arborescente în
Oracle
 Dacă în CONNECT BY PRIOR inversăm
ordinea atributelor, rezultatul va
conține o singură linie, întrucât linia
de pornire este aceea cu manager_id
NULL, linie care nu are nici o linie
părinte;
 SELECT employees.*, LEVEL FROM
employees START WITH manager_id
IS NULL CONNECT BY PRIOR
manager_id=employee_id;
10
Interogări arborescente în
Oracle
 Ierharhii:
 TOP-DOWN;
 BOTTOPM-UP.
 SELECT employees.*, LEVEL FROM
employees START WITH
first_name=‘Brian’ CONNECT BY PRIOR
employee_id=manager_id;
 SELECT employees.*, LEVEL FROM
employees START WITH
first_name=‘Brian’ CONNECT BY PRIOR
manager_id=employee_id;
11

S-ar putea să vă placă și