- Vad är en inre koppling?
- Vad är en yttre koppling?
- utföra yttre kopplingar med (+) Symbol
liksom praktiskt taget alla relationsdatabaser, Oracle tillåter frågor att genereras som kombinerar ellerJOIN
rader från två eller flera tabeller för att skapa slutresultatet set., Även om det finns många typer av kopplingar som kan utföras, är de vanligaste INNER JOIN
och OUTER JOIN
.
i den här handledningen utforskar vi kortfattat skillnaden mellanINNER
ochOUTER JOIN
och undersöker sedan stenografimetoden Oracle tillhandahåller för att utföraOUTER JOINS
specifikt med hjälp av operatörssymbolen+
.
Vad är en inre koppling?,
en INNER JOIN
I en relationsdatabas är helt enkelt sammanfogningen av två eller flera tabeller där resultatet endast kommer att innehålla data som uppfyllde alla anslutningsvillkor.
Här har vi till exempel en grundläggande library
schema med två tabeller: books
och languages
.,>
under tiden har vår books
tabell en language_id
rad som för de flesta, men inte alla, böcker innehåller helt enkelt language_id
associerad med bokens ursprungliga publicerade språk:
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 många fall kanske vi vill utföra en INNER JOIN
av books
och languages
tabeller så snarare än att visa det meningslösa language_id
värdet av varje bok, vi kan faktiskt se language name
language name
iv id = ” i stället.,
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
vad som är viktigt att notera här är att vår resultatuppsättning var något annorlunda i ovanstående två frågor. I det första listade vi helt enkelt den första 10
böckerna, men i INNER JOIN
– frågan returnerar vi bara resultat som uppfyller alla villkor från båda tabellerna. Av denna anledning ignoreras posten för Hamlet
(som har ett language_id
värde för null
eller tomt) och returneras inte i resultatet av vårt INNER JOIN
.,
Vad är en yttre koppling?
istället för att enbart returnera resultat som uppfyller alla anslutningsvillkor för en INNER JOIN
returnerar en OUTER JOIN
inte bara resultat som uppfyller alla villkor, utan returnerar också rader från en tabell som inte uppfyllde villkoret. Tabellen som väljs för denna ”bypass” av villkorliga krav bestäms av inriktningen eller” sidan ” av kopplingen, vanligtvis kalladLEFT
ellerRIGHT
yttre kopplingar.,
När du definierar en sida till din OUTER JOIN
anger du vilken tabell som alltid kommer att returnera sin rad även om den motsatta tabellen på andra sidan av kopplingen saknas eller null
värden som en del av sammanfogningsförhållandet.,
därför, om vi utför samma grundläggande JOIN
som ovan för att hämta books
och language names
, vet vi att vår books
tabell ska alltid returnera data, så vår JOIN
sida ska ”peka mot” vår tabellen, vilket gör tabellen languages
tabellen OUTER
som vi fäster vid den.,> förutom den mindre ändringen:
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 förväntat, genom att använda en LEFT OUTER JOIN
I stället för den tidigare INNER JOIN
, får vi det bästa av båda världarna: vi hoppar inte över några books
poster (t.ex. som Hamlet
) helt enkelt för att värdet language_id
är null
för den posten, men för alla poster där language_id
finns, får vi den snyggt formaterade language name
som erhållits från vår languages
tabell.,
utföra yttre kopplingar med (+) Symbol
som anges i den officiella dokumentationen, Oracle ger en speciellouter join operator
(+
symbol) som är stenografi för att utföraOUTER JOINS
.
i praktiken placeras symbolen+
direkt i det villkorliga uttalandet och på sidan av den valfria tabellen (den som får innehålla tomma ellernull
värden inom det villkorliga).,
därför kan vi återigen skriva om vår ovanLEFT OUTER JOIN
uttalande med+
operatör som så:
resultaten är desamma som standardLEFT OUTER JOIN
exempel ovan, så vi kommer inte att inkludera dem här. Det finns dock en kritisk aspekt att märka om syntaxen med+
– operatören förOUTER JOINS
.
+
operatören måste vara på vänster sida av det villkorliga (vänster om lika med=
– tecknet)., Därför, i det här fallet, eftersom vi vill se till att våra languages
tabell är den valfria tabellen som kan returnera null
värden under denna jämförelse, bytte vi ordningen på tabellerna i detta villkorliga, så languages
är till vänster (och är valfritt) medan books
är till höger.
slutligen, på grund av denna omordning av tabellsidorna i det villkorliga när du använder +
– operatören, är det viktigt att inse att ovanstående är helt enkelt stenografi för en RIGHT OUTER JOIN
., Det betyder att det här avsnittet av frågan:
FROM books b, library.languages lWHERE l.id (+)= b.language_id
…är effektivt identiskt med detta:
FROM library.languages lRIGHT OUTER JOIN books bON b.language_id = l.id
Lämna ett svar