• 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