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
Ciò che è fondamentale notare qui è che il nostro set di risultati era leggermente diverso nelle due query precedenti. Nel primo, abbiamo semplicemente elencato i primi libri10
, ma nella queryINNER JOIN
restituiamo solo risultati che soddisfano tutte le condizioni da entrambe le tabelle. Per questo motivo, il record diHamlet
(che ha unlanguage_id
valore dinull
o vuoto) viene ignorato e non restituito nel risultato del nostroINNER JOIN
.,
Che cos’è un Join esterno?
Invece di restituire esclusivamente risultati che soddisfano tutte le condizioni di join di unINNER JOIN
, unOUTER JOIN
restituisce non solo risultati che soddisfano tutte le condizioni, ma restituisce anche righe da una tabella che non soddisfacevano la condizione. La tabella scelta per questo ” bypass “dei requisiti condizionali è determinata dalla direzionalità o dal” lato”del join, in genere indicato come LEFT
o RIGHT
outer join.,
Quando definisci un lato del tuoOUTER JOIN
, stai specificando quale tabella restituirà sempre la sua riga anche se la tabella opposta dall’altra parte del join ha valori mancanti onull
come parte della condizione di join.,
Quindi, se facciamo la stessa base JOIN
come sopra per recuperare books
e language names
, sappiamo che il nostro books
tabella dovrebbe sempre restituire i dati, così il nostro JOIN
lato “verso” il nostro books
tabella, rendendo in tal modo il languages
tabella OUTER
tabella siamo connessi.,> a meno che minore alterazione:
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
Come previsto, utilizzando un LEFT OUTER JOIN
invece del precedente INNER JOIN
, stiamo facendo il meglio di entrambi i mondi: Non stiamo ignorando tutte books
record (ad esempio Hamlet
), semplicemente perché il language_id
valore null
per il record, ma per tutti i record in cui language_id
esiste, abbiamo la ben formattato language name
ottenuti dal nostro languages
tabella.,
Esecuzione di join esterni Utilizzando il simbolo ( + )
Come indicato nella documentazione ufficiale, Oracle fornisce uno specialeouter join operator
(il+
simbolo) che è una scorciatoia per eseguireOUTER JOINS
.
In pratica, il simbolo +
viene posizionato direttamente nell’istruzione condizionale e sul lato della tabella opzionale (quella a cui è consentito contenere valori vuoti o null
all’interno del condizionale).,
Pertanto, possiamo ancora una volta riscrivere la nostra istruzioneLEFT OUTER JOIN
usando l’operatore+
in questo modo:
I risultati sono gli stessi dello standardLEFT OUTER JOIN
esempio sopra, quindi non li includeremo qui. Tuttavia, c’è un aspetto critico da notare sulla sintassi utilizzando l’operatore +
per OUTER JOINS
.
L’operatore +
deve trovarsi sul lato sinistro del condizionale (a sinistra del segno uguale =
)., Pertanto, in questo caso, perché noi vogliamo che il nostro languages
table è il tavolo opzionale che può tornare null
valori durante questo confronto, abbiamo scambiato l’ordine delle tabelle in questo condizionale, e quindi languages
si trova sulla sinistra (è facoltativo) mentre books
si trova sulla destra.
Infine, a causa di questo riordino dei lati della tabella nel condizionale quando si utilizza l’operatore+
, è importante rendersi conto che quanto sopra è semplicemente una scorciatoia per unRIGHT OUTER JOIN
., Ciò significa che questo snippet della query:
FROM books b, library.languages lWHERE l.id (+)= b.language_id
effettivamente identico a questo:
FROM library.languages lRIGHT OUTER JOIN books bON b.language_id = l.id
Lascia un commento