• 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 sunt INNER JOIN și OUTER JOIN.

    În acest tutorial, vom explora pe scurt diferența dintre INNER și OUTER JOIN și apoi examina pe scurt metoda Oracle oferă pentru îndeplinirea OUTER 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 și languages.,>

î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