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