• hvad er en indre sammenføjning?
  • hvad er en ydre sammenføjning?
    • udførelse af ydre sammenføjninger ved hjælp af ( + ) symbolet

som stort set alle relationsdatabaser tillader Oracle at generere forespørgsler, der kombinerer eller JOIN rækker fra to eller flere tabeller for at oprette det endelige resultatsæt., Selvom der er adskillige typer sammenføjninger, der kan udføres, er de mest almindelige INNER JOIN og OUTER JOIN.

I denne tutorial, vil vi kort undersøge forskellen mellem INNER og OUTER JOIN og derefter undersøge, stenografi og metode Oracle giver for at udføre OUTER JOINS specielt ved brug af + operator-symbol.

Hvad er en indre sammenføjning?,

en INNER JOIN i en relationsdatabase er simpelthen sammenføjningen af to eller flere tabeller, hvor resultatet kun indeholder data, der opfyldte alle tilslutningsbetingelser.

For eksempel, her har vi en grundlæggende library skema med to tabeller: books og languages.,>

i Mellemtiden, vores books tabellen har en language_id træk, som for de fleste, men ikke alle, bøger blot indeholder language_id i forbindelse med den oprindelige offentliggjort sproget i bogen:

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 tilfælde, vi kan ønske at udføre en INNER JOIN af books og languages tabeller, så i stedet for at se det meningsløse language_id værdi af hver bog, vi kan faktisk se language name i stedet for.,

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

hvad der er kritisk at bemærke her er, at vores resultatsæt var lidt anderledes i ovenstående to forespørgsler. I den første listede vi simpelthen den første 10 bøger, men i INNER JOIN forespørgslen returnerer vi kun resultater, der opfylder alle betingelser fra begge tabeller. Af denne grund, registrering af Hamlet (som har en language_id værdi null eller tomme) ignoreres, og returneres ikke i resultatet af vores INNER JOIN.,

Hvad er en ydre sammenføjning?

i Stedet for udelukkende at returnere resultater, der opfylder alle deltage betingelser for en INNER JOIN en OUTER JOIN returnerer ikke kun er resultater, der opfylder alle betingelser, men returnerer også rækker fra en tabel, som ikke opfylder betingelsen. Tabellen, der er valgt til denne” bypass “af betingede krav, bestemmes af retningen eller” siden”af sammenføjningen, typisk benævnt LEFT eller RIGHT ydre sammenføjninger.,

Når du definerer en side til din OUTER JOIN, angiver du, hvilken tabel der altid vil returnere sin række, selvom den modsatte tabel på den anden side af sammenføjningen mangler eller null værdier som en del af sammenføjningstilstanden.,

Derfor, hvis vi udfører de samme grundlæggende JOIN som ovenfor for at hente books og language names, vi ved, at vores books tabel bør altid returnere data, så vores JOIN side skal “pege i retning af” vores books tabel, hvorved languages tabelposition > > OUTER tabel vi er knyttet til det.,> bortset fra, at mindre ændring:

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 hjælp af en LEFT OUTER JOIN i stedet for den tidligere INNER JOIN, så får vi det bedste af begge verdener: Vi er ikke springe over nogen af books poster (som f.eks. Hamlet), blot fordi den language_id værdi null for at optage, men for alle poster, hvor language_id findes, vi får pænt formateret language name opnået fra vores languages tabel.,

Udfører Ydre Joins Hjælp af Symbolet ( + )

Som angivet i den officielle dokumentation, Oracle giver en speciel outer join operator (+ symbolet), som er en forkortelse for at udføre OUTER JOINS.

I praksis + symbol er placeret direkte i den betingede sætning, og på den side af valgfri tabel (som er tilladt at indeholde tomme eller null værdier inden for den betingede).,

Derfor, vi igen kan omskrive vores derover LEFT OUTER JOIN erklæring ved brug af + operatør som så:

resultaterne er De samme som standard LEFT OUTER JOIN eksempel ovenfor, så vi vil ikke medtage dem her. Der er dog et kritisk aspekt at bemærke om syntaksen ved hjælp af+ operatør for OUTER JOINS.

+ operatør skal være på venstre side af den betingede (venstre for lig = tegn)., Derfor, i dette tilfælde, fordi vi ønsker at sikre, at vores languages tabel er valgfri tabel, der kan vende tilbage null – værdier under denne sammenligning, har vi byttet rækkefølgen af tabellerne i denne betingede, så languages er på venstre (og er valgfri) mens books på højre side.

Endelig, på grund af denne omlægning af tabel sider i den betingede når du bruger + operatør, er det vigtigt at indse, at ovenstående er blot en forkortelse for en RIGHT OUTER JOIN., Det betyder, at dette uddrag af forespørgslen:

FROM books b, library.languages lWHERE l.id (+)= b.language_id

…er i realiteten identisk med dette:

FROM library.languages lRIGHT OUTER JOIN books bON b.language_id = l.id