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

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

外部結合のあれこれ

さして重要なことではありませんが、参考までに外部結合について若干の補足をしておきます。


- 外部結合の左右に決まりはない -

外部結合には左と右の2種類がありますが、「どのような場合に右を使い、どのようなときには左を使えばよいのか?」という決まりはありません。RIGHTとLEFTを入れ替えた場合でも、JOIN演算子の左右に記述するテーブルの位置を入れ替えれば、結果が同じになるからです。

一般に、処理の中心となるテーブル(通常は参照側テーブル)を左に記述し、得たい結果によってRIGHTを使うかLEFTを使うかを決めます。例の場合なら、商品の情報が処理の中心であって、仕入先の情報は補助的に扱われるため、処理の中心となるテーブルは「仕入先_mr」ではなく「商品_mr」の方だと言えます。

従って、JOIN演算子の左側に「商品_mr」を記述し、「仕入先_mr」を基準とした結果を得るために右外部結合を用いるのが分かりやすいでしょう(但し、決まりではありません)。

  FROM 商品_mr A RIGHT OUTER JOIN 仕入先_mr B


- WHERE句による外部結合 -

外部結合の記述にはOUTER JOINを使う他に、WHERE句を使う方法もあります。

・右外部結合
  WHERE <参照側テーブル>.<フィールド> =* <被参照側テーブル>.<フィールド>

・左外部結合
  WHERE <参照側テーブル>.<フィールド> *= <被参照側テーブル>.<フィールド>

条件に用いる「=」演算子の右側に「*」記号を記述すれば右外部結合、左側に記述すれば左外部結合となります。従って、先に紹介したSQL(仕入先名に「テイコー産業」を表示する形式)は、以下のようにも記述できます。

・WHERE句を使った右外部結合
  SELECT A.商品ID, A.品名, A.仕入単価, A.仕入先ID, B.仕入先名
  FROM    商品_mr A , 仕入先_mr B
  WHERE   A.仕入先ID =* B.仕入先ID

・WHERE句を使った左外部結合
  SELECT A.商品ID, A.品名, A.仕入単価, A.仕入先ID, B.仕入先名
  FROM    商品_mr A , 仕入先_mr B
  WHERE   B.仕入先ID *=A.仕入先ID

その他、基準とする(すべてのレコードを表示させる)テーブルとフィールドの後に(+)記号を付ける方法もありますが、現在ではあまり使われません。

  SELECT A.商品ID, A.品名, A.仕入単価, A.仕入先ID, B.仕入先名
  FROM    商品_mr A , 仕入先_mr B
  WHERE   A.仕入先ID = B.仕入先ID (+)

SQL Serverのクエリアナライザではこの方法はエラーとなり、「行 3: ')' の近くに無効な構文があります」というメッセージが表示されます。内部/外部を問わず、結合の指定にはJOIN演算子を用い、WHERE句を使うのは旧形式であると捉えておきましょう。



トップページ
最も基本的な関連付け
内部結合と等結合
外部結合
外部結合のあれこれ
外部結合の左右に決まりはない
WHERE句による外部結合
完全外部結合
結合のまとめ
あとがき
Copyright © GrapeCity inc. All rights reserved.