- 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
Skriv et svar