DB

Oracle上で外部結合でテーブル結合する際に条件指定を追加してみた

Oracle上でテーブルA, テーブルBを結合する際に、外部結合を利用すると、テーブルBにデータが含まれていない場合も、テーブルAのデータを取得することができる。

外部結合については、以下のサイトを参照のこと。
https://www.shift-the-oracle.com/sql/left-right-outer-join.html

ただし、テーブルAとテーブルBを外部結合する際のテーブルBの抽出条件の指定位置を、left (outer) join句でなくwhere句にしてしまうと、外部結合を利用しているにも関わらず、テーブルAのデータが絞られて取得される事象が発生してしまう。

今回は、テーブルA, テーブルBを結合する際に、テーブルBの条件指定を追加した上で外部結合を利用してみたので、その結果を共有する。

前提条件

Oracle XEのインストールが完了していること。

やってみたこと

  1. 外部結合で利用するテーブルデータの作成
  2. 外部結合の実践

外部結合で利用するテーブルデータの作成

外部結合で利用するテーブルデータとして、テーブルA(employee)とテーブルB(dept)を作成する。その手順は、以下の通り。

1) テーブルB(dept)を作成する。

テーブルデータの作成_1

2) テーブルA(employee)を作成する。

テーブルデータの作成_2

3) テーブルB(dept)に検証用データを追加する。

テーブルデータの作成_3

4) テーブルB(dept)のデータを全件取得した結果は、以下の通り。

テーブルデータの作成_4

5) テーブルA(employee)に検証用データを追加する。

テーブルデータの作成_5

6) テーブルA(employee)のデータを全件取得した結果は、以下の通り。

テーブルデータの作成_6

なお、上記手順では、テーブルB(dept)⇒テーブルA(employee)の順に作成しているが、逆の順番でもよい。

サラリーマン型フリーランスSEという働き方でお金の不安を解消しよう先日、「サラリーマン型フリーランスSE」という働き方を紹介するYouTube動画を視聴しましたので、その内容をご紹介します。 「サ...

外部結合の実践

先ほど作成したデータを利用して、外部結合によるデータ抽出を行った結果は、以下の通り。

1) テーブルA(employee)とテーブルB(dept)を、条件指定せず外部結合してデータを取得した結果は以下の通りで、テーブルAの全データが取得されることが確認できる。

外部結合の実践_1

2) テーブルB(dept)が有効期限内で削除フラグ≠’1’であるデータのみ、テーブルBのデータを表示しつつ、テーブルA(employee)の全件を取得できるようにした結果は、以下の通り。

外部結合の実践_2

上記のように、有効期限内で削除フラグ≠’1’であるデータを抽出するという条件を、left join句に指定することで、テーブルA(employee)の全件が取得できることが確認できる。

3) 2)のように外部結合でテーブルA(employee)とテーブルB(dept)を結合しつつ、「テーブルB(dept)が削除フラグ≠’1’」という条件のみをwhere句に移動した結果は、以下の通り。

外部結合の実践_3

上記のように、テーブルA(employee)のデータのうち、削除フラグ=’1’であるdept_idをもつデータ(emp_id=10003)が、取得されないことが確認できる。

4) 2)のように外部結合でテーブルA(employee)とテーブルB(dept)を結合しつつ、「テーブルB(dept)が有効期限内」という条件のみをwhere句に移動した結果は、以下の通り。

外部結合の実践_4

上記のように、テーブルA(employee)のデータのうち、dept_idがテーブルB(dept)が有効期限内でないものや、対応するdept_idがleft join句で抽出した中に含まれないものは、取得されないことが確認できる。

5) 2)のように外部結合でテーブルA(employee)とテーブルB(dept)を結合しつつ、「有効期限内で削除フラグ≠’1’であるデータを抽出するという条件」という条件を全てwhere句に移動した結果は、以下の通り。

外部結合の実践_5

上記のように、テーブルA(employee)のデータのうち、dept_idがテーブルB(dept)が有効期限内でないもの・削除フラグが’1’のものや、対応するdept_idがテーブルB(dept)に含まれないものは、取得されないことが確認できる。

要点まとめ

  • テーブルAとテーブルBを外部結合する際のテーブルBの抽出条件の指定位置を、where句でなくleft (outer) join句にすることで、取得したいテーブルAの全データを正しく取得できる。