- Wat is een innerlijke Join?
- Wat is een buitenste Join?
- het uitvoeren van externe Joins met behulp van het ( + ) symbool
net als vrijwel alle relationele databases, staat Oracle toe query ‘ s te genereren die combineren of JOIN
rijen uit twee of meer tabellen om de eindresultaatset aan te maken., Hoewel er vele typen joins kunnen worden uitgevoerd, zijn de meest voorkomende de INNER JOIN
en de OUTER JOIN
.
in deze tutorial zullen we kort het verschil onderzoeken tussen de INNER
en OUTER JOIN
en vervolgens de steno methode onderzoeken die Oracle biedt voor het uitvoeren van OUTER JOINS
specifiek met behulp van het +
operator symbool.
Wat is een Inner Join?,
een INNER JOIN
in een relationele database is gewoon het samenvoegen van twee of meer tabellen waarin het resultaat alleen gegevens bevat die aan alle voorwaarden voor samenvoegen voldoen.
bijvoorbeeld, hier hebben we een basis library
schema met twee tabellen: books
en languages
.,>
Ondertussen onze books
tabel language_id
rij die voor de meeste, maar niet alle boeken bevat de language_id
geassocieerd met de oorspronkelijke gepubliceerd taal van het boek:
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
In veel gevallen, we willen voor het uitvoeren van een INNER JOIN
van de books
en languages
tabellen dus in plaats van het bekijken van de betekenisloze language_id
waarde van elke boek, kunnen we eigenlijk zien de language name
plaats.,
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
wat belangrijk is om hier op te merken is dat onze resultaatset iets anders was in de bovenstaande twee queries. In de eerste hebben we gewoon de eerste 10
boeken vermeld, maar in de INNER JOIN
query geven we alleen resultaten terug die aan alle voorwaarden van beide tabellen voldoen. Om deze reden wordt de record van Hamlet
(die een language_id
waarde van null
of leeg heeft) genegeerd en niet geretourneerd in het resultaat van onze INNER JOIN
.,
Wat is een buitenste Join?
in plaats van uitsluitend resultaten te retourneren die voldoen aan alle voorwaarden voor samenvoegen van een INNER JOIN
, geeft an OUTER JOIN
niet alleen resultaten terug die aan alle voorwaarden voldoen, maar geeft ook rijen uit één tabel terug die niet aan de voorwaarde voldoen. De tabel die wordt gekozen voor deze” bypass “van voorwaardelijke vereisten wordt bepaald door de directionaliteit of” side”van de verbinding, meestal aangeduid als LEFT
of RIGHT
buitenste verbindingen.,
wanneer u een zijde aan uw OUTER JOIN
definieert, geeft u aan welke tabel altijd zijn Rij retourneert, zelfs als de tegenoverliggende tabel aan de andere kant van de join ontbrekende of null
waarden heeft als onderdeel van de verbindingsvoorwaarde.,
Dus, als we dezelfde basis JOIN
zoals hierboven ophalen books
en language names
we weten dat onze books
tabel moet altijd retourneren gegevens, dus onze JOIN
kant moet “naar” onze books
tabel, waardoor de languages
tabel OUTER
tabel zijn we verbonden.,> behalve dat kleine wijziging:
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
Zoals verwacht, door het gebruik van een LEFT OUTER JOIN
in plaats van de vorige INNER JOIN
, krijgen we het beste van beide werelden: We hebben het niet overslaan van een books
records bevat (zoals Hamlet
) simpelweg omdat de language_id
waarde null
voor dat record, maar voor alle records waarin language_id
bestaat, we krijgen de mooi opgemaakte language name
verkregen van de languages
tabel.,
het uitvoeren van externe Joins met behulp van het ( + ) symbool
zoals aangegeven in de officiële documentatie, biedt Oracle een speciaal outer join operator
(het +
symbool) dat een afkorting is voor het uitvoeren van OUTER JOINS
.
in de praktijk wordt het symbool +
direct in de voorwaardelijke opdracht en aan de zijkant van de optionele tabel geplaatst (degene die lege of null
waarden mag bevatten binnen de voorwaardelijke).,
daarom kunnen we ons bovenstaande LEFT OUTER JOIN
statement opnieuw herschrijven met behulp van het +
operator als volgt:
de resultaten zijn hetzelfde als het standaard LEFT OUTER JOIN
voorbeeld hierboven, dus we zullen ze hier niet opnemen. Er is echter één belangrijk aspect om op te merken over de syntaxis met behulp van de +
operator voor OUTER JOINS
.
de+
operator moet aan de linkerkant van de conditionele (links van het is gelijk aan=
teken)., Daarom hebben we in dit geval, omdat we er zeker van willen zijn dat onze languages
tabel de optionele tabel is die null
waarden kan retourneren tijdens deze vergelijking, de volgorde van de tabellen in deze conditionele volgorde verwisseld, zodat languages
links is (en optioneel is) terwijl books
is rechts.
ten slotte, vanwege deze herindeling van de tabelzijden in de conditionele waarde bij gebruik van de+
operator, is het belangrijk om te beseffen dat het bovenstaande simpelweg een afkorting is voor eenRIGHT OUTER JOIN
., Dit betekent dat dit fragment van de query:
FROM books b, library.languages lWHERE l.id (+)= b.language_id
…effectief identiek is aan dit:
FROM library.languages lRIGHT OUTER JOIN books bON b.language_id = l.id
Geef een reactie