- 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ő library
sé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 JOIN
eredmé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 JOINS
rö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
Vélemény, hozzászólás?