- Hva er en Indre Bli med?
- Hva er en Ytre Bli med?
- Utføre Ytre Sammenføyninger ved Hjelp av (+) Symbol
Som nesten alle relasjonelle databaser, Oracle gjør spørringer til å bli generert som kombinerer eller JOIN
rader fra to eller flere tabeller for å lage det endelige resultat., Mens det er mange typer sammenføyninger som kan utføres, de vanligste er INNER JOIN
og OUTER JOIN
.
I denne opplæringen vil vi kort utforske forskjellen mellom INNER
og OUTER JOIN
og deretter undersøke kort-metoden Oracle gir for å utføre. OUTER JOINS
spesielt ved bruk av +
operatør symbolet.
Hva er en Indre Bli med?,
En INNER JOIN
i en relasjonsdatabase er rett og slett å bli med på to eller flere tabeller der resultatet vil bare inneholde data som tilfredsstilte alle bli med i forhold.
For eksempel, her har vi en grunnleggende library
skjema med to tabeller: books
og languages
.,>
i Mellomtiden, vår books
bordet har en language_id
rad som for de fleste, men ikke alle, bøker bare inneholder language_id
knyttet til den opprinnelige publisert språket i boken:
– >
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
I mange tilfeller, vi kan ønske å utføre en INNER JOIN
av books
og languages
bordene så heller enn å se det meningsløse language_id
verdi av hver bok, vi kan faktisk se language name
i stedet.,
– >
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
Det er avgjørende å merke seg her er at våre resultatene var litt ulike i de to ovennevnte spørsmål. I den første, vi bare listet opp de første 10
bøker, men i INNER JOIN
spørring vi bare returnere resultater som oppfyller alle betingelser fra begge tabellene. Dette er årsaken til at oppføringen av Hamlet
(som har en language_id
verdi null
eller tom) ignoreres, og som ikke er returnert i resultatet av vår INNER JOIN
.,
Hva er en Ytre Bli med?
i Stedet for utelukkende å returnere resultater som tilfredsstiller alle bli med i forhold til en INNER JOIN
en OUTER JOIN
returnerer ikke bare resultater som tilfredsstiller alle forhold, men også returnerer rader fra en tabell som ikke oppfylte vilkåret. Tabellen som er valgt for denne «bypass» av betingede krav er fastsatt av tekstretning eller «side» av delta, vanligvis referert til som LEFT
eller RIGHT
ytre sammenføyninger.,
Når du definerer en side til din OUTER JOIN
er du spesifisere hvilke tabellen vil alltid returnere sin rad, selv om det motsatte bord på den andre siden av delta har mangler eller null
verdier som en del av det å bli tilstand.,
Derfor, hvis vi utføre de samme grunnleggende JOIN
som over for å hente books
og language names
, vet vi at vår books
bordet skal alltid returnere data, så vår JOIN
side bør «peker mot» vår books
bordet, og dermed gjøre languages
table OUTER
tabell vi er knyttet til det.,> bortsett fra at mindre endring:
– >
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
Som forventet, ved hjelp av et LEFT OUTER JOIN
i stedet for den forrige INNER JOIN
, vi får det beste av begge verdener: Vi er ikke hoppe over alle books
poster (for eksempel Hamlet
) rett og slett fordi language_id
verdi null
for denne posten, men for alle poster der language_id
eksisterer, vi får pent formatert language name
innhentet fra vår languages
tabell.,
Utføre Ytre Sammenføyninger ved Hjelp av (+) Symbol
Som angitt i den offisielle dokumentasjonen, Oracle gir en spesiell outer join operator
(+
symbol) som er en forkortelse for utøvende OUTER JOINS
.
I praksis, +
symbolet er plassert direkte i betinget utsagn og på siden av den ekstra bord (den ene som er tillatt å inneholde tomme eller null
verdier innenfor betinget).,
Derfor, kan vi igjen omskrive våre ovenfor LEFT OUTER JOIN
uttalelse ved hjelp av +
operatør som så:
resultatene er De samme som standard LEFT OUTER JOIN
eksempelet over, så vi vil ikke ta dem med her. Men, det er et kritisk aspekt å merke seg om syntaks ved å bruke +
operatør for OUTER JOINS
.
+
operatør må være på venstre side av betinget (til venstre for likhetstegnet =
– tegn)., Derfor, i dette tilfellet, fordi vi ønsker å sikre at vår languages
bordet er det ekstra bord som kan returnere null
verdier i løpet av denne sammenligningen, vi byttet om rekkefølgen av tabellene i denne betinget, så languages
er på venstre side (og er valgfritt) mens books
er på høyre side.
til Slutt, på grunn av denne omlegging av tabellen sider i betinget når du bruker +
operatør, er det viktig å innse at ovennevnte er bare en forkortelse for en RIGHT OUTER JOIN
., Dette betyr at denne kodebiten av spørringen:
– >
FROM books b, library.languages lWHERE l.id (+)= b.language_id
…er i praksis identisk med denne:
– >
FROM library.languages lRIGHT OUTER JOIN books bON b.language_id = l.id
Legg igjen en kommentar