データベース千夜一夜第12回

テーブルの関連付け(2)~内部結合と外部結合 長谷川裕行
有限会社 手國堂

完全外部結合

外部結合には、この他に双方のテーブルに記録されたすべてのレコードを抽出する「完全外部結合」があります。


- すべてのレコードを表示する -

左/右外部結合では、JOIN演算子の左右どちらかのテーブルを基準にして、そのテーブルのすべてのレコードを抽出しました。従って、基準としないテーブルの側に条件に一致しないレコードがあっても、それは表示されません。完全外部結合では、どちらのテーブルに「もう一方と一致しないレコード」があっても、それらがすべて表示されます。

完全外部結合ではJOIN演算子をFULL OUTERで修飾します。

  FROM <参照側テーブル> FULL OUTER JOIN <被参照側テーブル>
  ON 条件式

「商品_mr」はダイアグラムで参照整合性を設定しているので、ここでは同じ構造の「商品_dmy」で試してみましょう(「商品_dmy」テーブルを作るには、先述したようにクエリアナライザで“SELECT * INTO 商品_dmy FROM 商品_mr”というSQLを実行します2※

Enterprise Managerで「商品_dmy」を開き、先頭レコードの「商品ID=13518/品名=オルゴール付き宝石箱(A)」の「仕入先ID」欄を“2”から存在しない“901”に書き換えて保存します。

※2 サンプルのex00.sqlに同じ内容のSQLが記録されているので、クエリアナライザでそれを開いて実行しても構いません



- 存在しない値は“NULL”になる -

これで、「商品_mr」の「オルゴール付き宝石箱(A)」は「仕入先」が存在せず、「仕入先_mr」の「テイコー産業」は「仕入れている商品」が存在しない――ということで、双方のテーブルに条件に合致しないレコードが1件ずつ存在する状態となります。

ここで、以下のようなSQLを実行します。

  SELECT A.商品ID, A.品名, A.仕入単価, A.仕入先ID, B.仕入先名
  FROM    商品_dmy A FULL OUTER JOIN 仕入先_mr B

  ON        A.仕入先ID = B.仕入先ID

結果を見れば、

  仕入先の存在しない「オルゴール付き宝石箱(A)」も
  商品の存在しない「テイコー産業」も
  両方表示されている

ことが分かります。

「オルゴール付き宝石箱(A)」では仕入先の情報が“NULL”に、「テイコー産業」では商品の情報が“NULL”になっています。




トップページ
最も基本的な関連付け
内部結合と等結合
外部結合
外部結合のあれこれ
完全外部結合
すべてのレコードを表示する
存在しない値は“NULL”になる
結合のまとめ
あとがき
Copyright © MESCIUS inc. All rights reserved.