• 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 JOINoch OUTER JOIN.

i den här handledningen utforskar vi kortfattat skillnaden mellanINNERochOUTER JOINoch undersöker sedan stenografimetoden Oracle tillhandahåller för att utföraOUTER JOINSspecifikt 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 JOINreturnerar 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