• mi az a Belső Csatlakozás?
  • mi a Külső Csatlakozás?
    • Végző Külső Csatlakozik Segítségével (+) Jelre

Mint szinte minden relációs adatbázisok, Oracle lehetővé teszi, lekérdezések, hogy létre, hogy össze vagy JOIN sor két vagy több táblázatok létrehozása, a végeredmény beállítása., Bár számos típusú csatlakozást lehet végrehajtani, a leggyakoribb a INNER JOIN és a OUTER JOIN.

ez A bemutató, majd röviden fedezze fel a különbség a között, hogy a INNER vagy OUTER JOIN majd megvizsgálja a gyorsírás módszer Oracle rendelkezik teljesítő OUTER JOINS kifejezetten használja a + üzemeltető szimbólum.

mi a Belső Csatlakozás?,

An INNER JOIN egy relációs adatbázisban egyszerűen két vagy több tábla összekapcsolása, amelyben az eredmény csak olyan adatokat tartalmaz, amelyek teljesítették az összes csatlakozási feltételt.

például itt van egy alapvető libraryséma két táblával:bookséslanguages.,>

Eközben a books asztalon van egy language_id sor, amely a legtöbb, de nem az összes, könyvek egyszerűen tartalmazza a language_id kapcsolódó eredeti közzétett nyelven könyv:

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

sok esetben, lehet, kívánom, hogy végre egy INNER JOIN, hogy a books vagy languages táblázatok, így inkább, mint megtekintése az értelmetlen language_id érték minden könyv, láthatjuk, hogy a language name helyett.,

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

ami itt fontos megjegyezni, hogy eredménykészletünk kissé eltérő volt a fenti két lekérdezésben. Az elsőben egyszerűen felsoroltuk az első 10 könyveket, de a INNER JOIN lekérdezésben csak olyan eredményeket adunk vissza, amelyek mindkét táblázatból megfelelnek az összes feltételnek. Emiatt a Hamlet (amelynek language_id értéke null vagy üres) rekordját figyelmen kívül hagyják, és a INNER JOINeredményében nem térnek vissza.,

mi a Külső Csatlakozás?

a INNER JOIN minden csatlakozási feltételnek megfelelő eredmény helyett egy OUTER JOIN nem csak az összes feltételnek megfelelő eredményt adja vissza, hanem egy táblázat sorait is, amelyek nem felelnek meg a feltételnek. A feltételes követelmények ezen “megkerülésére” választott táblázatot a csatlakozás irányossága vagy “oldala” határozza meg, jellemzően LEFT vagy RIGHT külső csatlakozások.,

a OUTER JOIN oldalának meghatározásakor megadja, hogy melyik tábla mindig visszaadja a sorát, még akkor is, ha a Csatlakozás másik oldalán lévő ellentétes tábla hiányzik vagy null értékek hiányoznak a csatlakozási feltétel részeként.,

Ezért, ha elvégzi az alapvető JOIN, mint a fenti letöltése books vagy language names, tudjuk, hogy a books asztal kell mindig vissza adatokat, tehát a JOIN oldalon kell “pont felé” a books asztalt, így, hogy a languages táblázat a OUTER táblázat vagyunk együtt.,> kivéve, hogy kisebb módosítás:

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

Ahogy az várható volt, segítségével egy LEFT OUTER JOIN ahelyett, hogy a korábbi INNER JOIN vagyunk, hogy a legjobbat nyújtja: Nem fogjuk kihagyni bármilyen books feljegyzések (mint például a Hamlet), egyszerűen azért, mert a language_id érték null bejegyzés, még az összes rekordot, ahol a language_id létezik, mi a szépen formázott language name nyert a languages táblázat.,

külső csatlakozások végrehajtása a (+) szimbólum segítségével

amint azt a hivatalos dokumentáció jelzi, az Oracle egy speciális outer join operator (a + szimbólum), amely a OUTER JOINSrövidítése.

a gyakorlatban a+ szimbólum közvetlenül a feltételes nyilatkozatban és az opcionális táblázat oldalán helyezkedik el (az üres vagynull értékeket tartalmazhat a feltételes módban).,

ezért újra átírhatjuk a fentiLEFT OUTER JOIN állításunkat a+ operátor segítségével, mint így:

Az eredmények ugyanazok, mint a standardLEFT OUTER JOIN példa fent, így nem fogjuk ide felvenni őket. Azonban van egy kritikus szempont, hogy észre a szintaxist a +operátor OUTER JOINS.

a+ operátornak a feltételes bal oldalán kell lennie (az egyenlő részektől balra= jel)., Ezért ebben az esetben, mivel biztosítani akarjuk, hogy a languages táblázat az opcionális táblázat, amely visszaadhatja a null értékeket az összehasonlítás során, kicseréltük a táblázatok sorrendjét ebben a feltételben, így languages balra van (és opcionális), míg books van a jobb oldalon.

végül, mivel ez átrendezése a táblázat oldalán a feltételes, ha a + operátor, fontos felismerni, hogy a fenti egyszerűen rövidítés a RIGHT OUTER JOIN., Ez azt jelenti, hogy a lekérdezés ezen része:

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

…gyakorlatilag megegyezik ezzel:

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