Documente Academic
Documente Profesional
Documente Cultură
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