- ce este o asociere interioară?
- ce este un Join exterior? la fel ca aproape toate bazele de date relaționale, Oracle permite generarea de interogări care combină sau
JOIN
rânduri din două sau mai multe tabele pentru a crea setul de rezultate finale., Deși există numeroase tipuri de îmbinări care pot fi efectuate, cele mai frecvente suntINNER JOIN
șiOUTER JOIN
.În acest tutorial, vom explora pe scurt diferența dintre
INNER
șiOUTER JOIN
și apoi examina pe scurt metoda Oracle oferă pentru îndeplinireaOUTER JOINS
folosind în special+
operator simbol.ce este o îmbinare interioară?,
Un
INNER JOIN
într-o bază de date relațională este pur și simplu unirea a două sau mai multe tabele în care rezultatul va conține numai date care au satisfăcut toate se alăture condiții.De exemplu, aici avem o bază
library
schema cu două tabele:books
șilanguages
.,>
între Timp, ne books
tabel are un language_id
rând, care pentru cele mai multe, dar nu toate, cărți pur și simplu conține language_id
asociate cu originalul publicat în limba cărții:
SELECT * FROM booksORDER BY idFETCH FIRST 10 ROWS ONLY;id title author year_published language_id1 In Search of Lost Time Marcel Proust 1913 22 Ulysses James Joyce 1922 13 Don Quixote Miguel de Cervantes 1605 54 Moby Dick Herman Melville 1851 15 Hamlet William Shakespeare 1601 (null)6 War and Peace Leo Tolstoy 1869 87 The Odyssey Homer -700 98 The Great Gatsby F. Scott Fitzgerald 1925 19 The Divine Comedy Dante Alighieri 1472 1010 Madame Bovary Gustave Flaubert 1857 2
În multe cazuri, ne-am putea dori pentru a efectua un INNER JOIN
de books
și languages
tabele deci, mai degrabă decât vizualizarea sens language_id
valoare de fiecare carte, putem vedea de fapt language name
în loc.,
SELECT b.id, b.title, b.author, b.year_published, l.name languageFROM books bINNER JOIN library.languages lON b.language_id = l.idORDER BY b.idFETCH FIRST 10 ROWS ONLY;id title author year_published language1 In Search of Lost Time Marcel Proust 1913 French2 Ulysses James Joyce 1922 English3 Don Quixote Miguel de Cervantes 1605 Spanish4 Moby Dick Herman Melville 1851 English6 War and Peace Leo Tolstoy 1869 Russian7 The Odyssey Homer -700 Greek8 The Great Gatsby F. Scott Fitzgerald 1925 English9 The Divine Comedy Dante Alighieri 1472 Italian10 Madame Bovary Gustave Flaubert 1857 French11 The Brothers Karamazov Fyodor Dostoyevsky 1880 Russian
ceea ce este esențial să rețineți aici este că setul nostru de rezultate a fost ușor diferit în cele două interogări de mai sus. În prima, am enumerat pur și simplu primele cărți 10
, dar în interogarea INNER JOIN
returnăm Doar rezultate care îndeplinesc toate condițiile din ambele tabele. Pentru acest motiv, recordul de Hamlet
(care are un language_id
valoarea null
sau gol) este ignorat și nu a revenit în rezultatul nostru INNER JOIN
.,
ce este o îmbinare exterioară?
în Loc exclusiv revenind rezultate care satisfac toate se alăture condiții de un INNER JOIN
, un OUTER JOIN
se întoarce nu numai rezultatele care îndeplinesc toate condițiile, dar, de asemenea, se întoarce rânduri dintr-un tabel care nu îndeplinește condiția. Tabelul care este ales pentru acest „by-pass” condiționată de cerințe este determinată de direcția sau „parte” a alătura, de obicei, menționată ca LEFT
sau RIGHT
exterior se alătură.,
atunci Când se definește o parte a ta OUTER JOIN
, se precizează care tabelul se va întoarce întotdeauna rândul său, chiar dacă adverse tabelul de pe partea cealaltă a se alătura are lipsă sau null
valori ca parte a conditia.,
prin Urmare, dacă vom efectua aceeași bază JOIN
ca mai sus pentru a prelua books
și language names
, că books
masă ar trebui să se întoarcă mereu de date, deci JOIN
parte ar trebui să „spre punctul” nostru books
masă, făcând astfel languages
tabelul OUTER
tabelul suntem aferente.,> cu excepția faptului că minoră modificare:
SELECT b.id, b.title, b.author, b.year_published, l.name languageFROM books bLEFT OUTER JOIN library.languages lON b.language_id = l.idORDER BY b.idFETCH FIRST 10 ROWS ONLY;id title author year_published language1 In Search of Lost Time Marcel Proust 1913 French2 Ulysses James Joyce 1922 English3 Don Quixote Miguel de Cervantes 1605 Spanish4 Moby Dick Herman Melville 1851 English5 Hamlet William Shakespeare 1601 (null)6 War and Peace Leo Tolstoy 1869 Russian7 The Odyssey Homer -700 Greek8 The Great Gatsby F. Scott Fitzgerald 1925 English9 The Divine Comedy Dante Alighieri 1472 Italian10 Madame Bovary Gustave Flaubert 1857 French
Cum era de așteptat, folosind un LEFT OUTER JOIN
în loc de precedent INNER JOIN
, obținem cel mai bun din ambele lumi: Nu suntem sărind peste orice books
înregistrări (cum ar fi Hamlet
) pur și simplu pentru că language_id
valoare null
pentru acest record, dar pentru toate înregistrările unde language_id
există, ajungem frumos formatate language name
obținut din nostru languages
masă.,
Efectuarea Exterior se Alătură Folosind (+) Simbol
Cum se indică în documentația oficială, Oracle oferă o special outer join operator
(+
simbol), care este prescurtarea pentru efectuarea OUTER JOINS
.
În practică, +
simbolul este plasat direct în declarații condiționale și pe partea de optional masa (cel care este permis să conțină gol sau null
valori în cadrul condiționată).,
prin Urmare, putem încă o dată a rescrie de mai sus LEFT OUTER JOIN
declarație folosind +
operator astfel:
rezultatele sunt la fel ca cele standard LEFT OUTER JOIN
exemplul de mai sus, deci nu vom include aici. Cu toate acestea, există un aspect critic pentru a observa despre sintaxă, folosind +
operator pentru OUTER JOINS
.
+
operatorul trebuie să fie pe partea stângă a condiționale (stânga este egal cu =
semn)., Prin urmare, în acest caz, pentru că dorim să ne asigurăm că languages
masa este optional masa care poate reveni null
valori în această comparație, am schimbat ordinea de mese, în acest condiționată, deci languages
este pe stânga (și este opțional) în timp ce books
este pe dreapta.
în cele din Urmă, pentru că de această reordonare a mesei în condiționată atunci când se utilizează +
operator, este important să realizăm că cele de mai sus este pur și simplu o prescurtare pentru un RIGHT OUTER JOIN
., Acest lucru înseamnă că acest fragment de interogare:
FROM books b, library.languages lWHERE l.id (+)= b.language_id
…este efectiv identic cu acesta:
FROM library.languages lRIGHT OUTER JOIN books bON b.language_id = l.id
Lasă un răspuns