• 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