CATEGORII DOCUMENTE |
Sa privim pentru inceput la tabelul II.3.5, rezultatul rularii unei comenzi de equijoin. Se poate observa ca lipsesc din acest tabel doua persoane: Georgescu si Marinescu. De ce oare? Se poate vedea in tabelele II.3.1 si II.3.2 ca Georgescu nu lucreaza inca la nici o firma, iar Marinescu este asignat unui firme care nu exista (poate inca nu exista sau a fost desfiintata). Deci pentru acesti doi angajati nu se poate gasi nici o inregistrare in tabela Firme pentru care conditia de equijoin sa fie indeplinita, si de aceea nu sunt afisati.
Daca dorim totusi sa afisam toti angajatii din tabela persoane, indiferent daca lucreaza sau nu la o firma, va trebui sa putem suplini cumva aceasta lipsa de informatii.
Pentru a indica lipsa de informatii dintr-o tabela, vom folosi secventa (+) imediat dupa numele coloanei din tabela respectiva din conditia de join din clauza WHERE
De exemplu urmatoarea comanda va afisa toate persoanele cu sau fara firma corespunzatoare vom scrie in sintaxa Oracle:
SELECT a.nume, a.prenume, b.nume
FROM persoane a, firme b
WHERE a.IdFirm = b.IdFirm (+)
Rezultatul rularii acestei comenzi este cel din tabelul II.3.6.
Tabelul II.3.6. Outer Join
Nume |
Prenume |
NumeFirma |
Antonescu |
Elena |
SC Crisib SA |
Popescu |
Ioan |
SC Crisib SA |
Bischin |
Paraschin |
SC SoftCom |
Vasilescu |
Vasile |
SC SoftCom |
Olaru |
Angela |
Brasoveanca |
Ionescu |
Gheorghe |
Brasoveanca |
Marinescu |
Angela | |
Georgescu |
Maria |
Se observa ca semnul se gaseste dupa coloana IdFirm din tabela firme b). Aceasta tabela fiind a doua tabela din clauza FROM, vom spune ca este vorba de un LEFT OUTER JOIN, adica sunt afisate toate inregistrarile din tabela din stanga din clauza FROM cu sau fara inregistrari corespunzatoare in tabela a doua. Sintaxa ANSI foloseste clauza LEFT OUTER JOIN impreuna cu ON. Comanda anterioara este echivalenta cu urmatoarea comanda in sintaxa ANSI:
SELECT a.nume, a.prenume, b.nume
FROM persoane a LEFT OUTER JOIN firme b
ON (a.IdFirm = b.IdFirm)
Daca vom pune semnul in dreptul celeilalte tabele, adica vom scrie:
SELECT a.nume, a.prenume, b.nume
FROM persoane a, firme b
WHERE a.IdFirm (+) = b.IdFirm
se vor afisa toate firmele, cu sau fara angajati, adica toate inregistrarile din tabela aflata in dreapta in clauza FROM (firme), cu sau fara inregistrari corespunzatoare in cealalta tabela, adica cu sau fara angajati. Este asadar vorba despre un RIGHT OUTER JOIN. Astfel in sintaxa ANSI vom scrie:
SELECT a.nume, a.prenume, b.nume
FROM persoane a RIGHT OUTER JOIN firme b
ON (a.IdFirm = b.IdFirm)
Rezultatul obtinut va fi cel din tabelul II.3.7.
Tabelul II.3.7. Right Outer Join
Nume |
Prenume |
NumeFirma |
Ionescu |
Gheorghe |
Brasoveanca |
Vasilescu |
Vasile |
SC SoftCom |
Popescu |
Ioan |
SC Crisib SA |
Antonescu |
Elena |
SC Crisib SA |
Bischin |
Paraschin |
SC SoftCom |
Olaru |
Angela |
Brasoveanca |
SC TimTip |
Figura II.3.4. Right Outer Join
ATENTIE este importanta ordinea tabelelor in clauza FROM nu ordinea in care sunt scrise cele doua parti ale egalitatii din clauza WHERE respectiv ON. Astfel comenile:
SELECT a.nume, a.prenume, b.nume
FROM persoane a, firme b
WHERE a.IdFirm = b.IdFirm (+)
siSELECT a.nume, a.prenume, b.nume
FROM persoane a, firme b
WHERE b.IdFirm (+) = a.IdFirm
sunt echivalente si reprezinta un LEFT OUTER JOIN, chiar daca semnul apare o data in stanga semnului de egalitate si o data in dreapta semnului de egalitate.
De asemenea, desi urmatoarele doua comenzi sunt echivalente:
SELECT a.nume, a.prenume, b.nume
FROM persoane a, firme b
WHERE a.IdFirm = b.IdFirm (+)
siSELECT a.nume, a.prenume, b.nume
FROM firme b, persoane a
WHERE a.IdFirm = b.IdFirm (+)
prima este un LEFT OUTER JOIN iar a doua este un RIGHT OUTER JOIN, pentru ca se afiseaza toate inregistrarile din tabela a (cea care nu are + in dreptul ei), tabela care in prima comanda se gaseste in stanga in clauza FROM, iar in a doua comanda se gaseste in dreapta in clauza FROM
V-ati putea intreba acum cum am putea sa afisam toate inregistrarile din ambele tabele, indiferent daca ele au sau nu corespondent in cealalta tabela. Am dori deci sa obtinem tabelul urmator:
Tabelul II.3.8. Full Outer Join
Nume |
Prenume |
NumeFirma |
Antonescu |
Elena |
SC Crisib SA |
Popescu |
Ioan |
SC Crisib SA |
Bischin |
Paraschin |
SC SoftCom |
Vasilescu |
Vasile |
SC SoftCom |
Olaru |
Angela |
Brasoveanca |
Ionescu |
Gheorghe |
Brasoveanca |
Marinescu |
Angela | |
Georgescu |
Maria | |
SC TimTip |
Apar atat persoanele care nu sunt inca angajate, sau a caror firma nu mai exista in baza de date, dar si firmele pentru care nu avem nici un angajat memorat in baza de date. Am fi tentati sa scriem:
SELECT a.nume, a.prenume, b.nume
FROM firme b, persoane a
WHERE a.IdFirm (+) = b.IdFirm (+)
adica sa punem (+) in ambele parti ale semnului de egalitate pentru ca avem de suplinit lipsa de informatii din ambele tabele. Insa sintaxa Oracle nu permite acest lucru! Singura modalitate de a obtine un FULL OUTER JOIN este de a folosi sintaxa ANSI:
SELECT a.nume, a.prenume, b.nume
FROM persoane a FULL OUTER JOIN firme b
ON (a.IdFirm = b.IdFirm)
Tabelul urmator face o sinteza a comenzilor JOIN din acest capitol, punand fata in fata comenzile echivalente folosind cele doua sintaxe.Tabelul II.3.9. Comparatie intre sintaxa Oracle si sintaxa ANSI
Sintaxa Oracle |
Sintaxa ANSI/ISO |
Produsul Cartezian |
|
SELECT p.nume, p.prenume, f.nume FROM persoane p, firme f |
SELECT p.nume, p.prenume, f.nume FROM persoane p CROSS JOIN firme f |
Equijoin |
|
SELECT p.nume, prenume, f.nume FROM persoane p, firme f WHERE p.idfirm = f.idfirm |
SELECT p.nume, prenume, f.nume FROM personae p JOIN firme f USING (IdFirm) |
SELECT p.nume, prenume, f.nume FROM persoane p, firme f WHERE p.idfirm = f.idfirm AND p.nume=f.nume |
SELECT nume, prenume, FROM persoane p NATURAL JOIN firme f NU AFISEAZA NIMIC !!! |
SELECT a.nume, a.prenume, b.disciplina, b.data, b.nota FROM elevi a, firme b WHERE a.nume=b.nume AND a.prenume=b.prenume |
SELECT nume, prenume, disciplina, data, nota FROM elevi NATURAL JOIN note |
SELECT p.nume, prenume, f.nume FROM persoane p, firme f WHERE p.IdFirm=f.IdFirm |
SELECT p.nume, prenume, f.nume FROM persoane p JOIN firme f USING (IdFirm) |
Nonequijoin |
|
SELECT nume, prenume, disciplina, data, calificativ FROM note, calificative WHERE nota BETWEEN nota1 AND nota2 |
SELECT nume, prenume, disciplina, data, calificativ FROM note JOIN calificative ON (nota BETWEEN nota1 AND nota2) |
Selfjoin |
|
SELECT a.nume ||' '|| a.prenume AS 'Angajat', b.nume ||' '|| b.prenume AS 'Sef' FROM angajat a, angajat b WHERE a.id_manager = b.id |
SELECT a.nume ||' '|| a.prenume AS 'Angajat', b.nume ||' '|| b.prenume AS 'Sef' FROM angajat a JOIN angajat b ON (a.id_manager = b.id) |
Outer Join |
|
SELECT a.nume, a.prenume, b.nume FROM persoane a, firme b WHERE a.IdFirm = b.IdFirm (+) |
SELECT a.nume, a.prenume, b.nume FROM persoane a LEFT OUTER JOIN firme b on(a.IdFirm = b.IdFirm) |
SELECT a.nume, a.prenume, b.nume FROM persoane a, firme b WHERE a.IdFirm (+) = b.IdFirm |
SELECT a.nume, a.prenume, b.nume FROM persoane a RIGHT OUTER JOIN firme b ON (a.IdFirm = b.IdFirm) |
NU EXSITA ECHIVALENT ! |
SELECT a.nume, a.prenume, b.nume FROM persoane a FULL OUTER JOIN firme b ON (a.IdFirm = b.IdFirm) |
Politica de confidentialitate | Termeni si conditii de utilizare |
Vizualizari: 1326
Importanta:
Termeni si conditii de utilizare | Contact
© SCRIGROUP 2024 . All rights reserved