• 内部結合とは何ですか?
  • 外部結合とは何ですか?
    • (+)記号を使用した外部結合の実行

ほぼすべてのリレーショナル-データベースと同様に、oracleでは、複数の表からorJOIN行を組み合わせて, 実行できる結合にはさまざまな種類がありますが、最も一般的なものはINNER JOINOUTER JOINです。

このチュートリアルでは、INNEROUTER JOINの違いを簡単に調べ、特に+演算子シンボルを使用してOUTER JOINSを実行するためにOracleが提供する省略形メソッドを調べます。

内部結合とは何ですか?,

リレーショナルデータベース内のINNER JOINは、単に複数のテーブルを結合することで、結果にはすべての結合条件を満たすデータのみが含まれます。

たとえば、ここでは、基本的なlibrary二つのテーブルを持つスキーマがあります:bookslanguages。,一方、私たちのbooksテーブルにはlanguage_id行があり、ほとんどの場合、すべてではありませんが、書籍には単にlanguage_id本の元の公開言語に関連付けられています。

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

多くの場合、INNER JOINbooksおよびlanguagesテーブルを実行したい場合がありますので、各書籍の無意味なlanguage_id値を見るのではなく、実際にlanguage name代わりに。,

ここで重要なのは、上記の二つのクエリで結果セットがわずかに異なっていたことです。 最初に、最初の10書籍をリストしましたが、INNER JOINクエリでは、両方のテーブルのすべての条件を満たす結果のみを返します。 このため、Hamletlanguage_id値がnullまたは空)のレコードは無視され、INNER JOINの結果に返されません。,

外部結合とは何ですか?

INNER JOINのすべての結合条件を満たす結果を排他的に返すのではなく、OUTER JOINはすべての条件を満たす結果だけでなく、条件を満たさなかったテーブルの行も返します。 条件付き要件のこの”バイパス”に対して選択されるテーブルは、通常、LEFTまたはRIGHT外部結合と呼ばれる結合の方向性または”サイド”によって決定されます。,

OUTER JOIN側を定義するとき、結合の反対側の反対側の反対側のテーブルが欠落している場合でも、null結合条件の一部として,

したがって、上記と同じ基本的なJOINを実行してbookslanguage namesを取得すると、booksテーブルは常にデータを返す必要があるため、JOIN“私たちのbooksテーブル、それによってlanguagesテーブルをOUTERテーブルに添付しています。,

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

期待どおり、LEFT OUTER JOIN前のINNER JOINの代わりに、両方の長所を得ています。booksレコードをスキップしていません。などHamlet)単純にlanguage_id値はnullそのレコードのために、まだlanguage_idが存在するすべてのレコードのために、我々はうまくフォーマットされたlanguage name私たちから得られたテーブル。,

(+)記号を使用した外部結合の実行

公式文書に示されているように、oracleはouter join operator(+シンボル)を提供し、OUTER JOINSを実行するための省略形です。

実際には、+シンボルは、条件文内およびオプションのテーブル(空またはnull条件内の値を含むことが許されるもの)の側に直接配,

したがって、上記のLEFT OUTER JOINステートメントを+演算子を使用して次のように書き換えることができます。

結果は、上記の標準のLEFT OUTER JOIN例と同じですので、ここには含めません。 ただし、+OUTER JOINSの演算子を使用する構文について注意すべき重要な側面があります。

+演算子は、条件の左側(equals=記号の左側)にある必要があります。, したがって、この場合、languagesテーブルがnull値を返すことができるオプションのテーブルであることを確認したいので、この比較中に、この条件でテーブルの順序を入れ替えたので、languagesは左側(およびオプションです)にあり、booksは左側(およびオプションです)にあります。そうだな

最後に、+演算子を使用する場合、条件付きでテーブルの側面を並べ替えるため、上記は単にRIGHT OUTER JOINの短縮形であることを認識することが重要です。, これは、クエリのこのスニペットを意味します:

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

…これと実質的に同じです:

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