Scrigroup - Documente si articole

     

HomeDocumenteUploadResurseAlte limbi doc
AccessAdobe photoshopAlgoritmiAutocadBaze de dateCC sharp
CalculatoareCorel drawDot netExcelFox proFrontpageHardware
HtmlInternetJavaLinuxMatlabMs dosPascal
PhpPower pointRetele calculatoareSqlTutorialsWebdesignWindows
WordXml


OuterJoin

sql



+ Font mai mare | - Font mai mic



OuterJoin


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

Figura II.3.3. Left Outer Join

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 (+)

si

SELECT 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 (+)

si

SELECT 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

Figura II.3.5. Full Outer Join

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



DISTRIBUIE DOCUMENTUL

Comentarii


Vizualizari: 1326
Importanta: rank

Comenteaza documentul:

Te rugam sa te autentifici sau sa iti faci cont pentru a putea comenta

Creaza cont nou

Termeni si conditii de utilizare | Contact
© SCRIGROUP 2024 . All rights reserved