結合プロパティと内部結合・外部結合

 クエリでは2つのテーブルを「線で結ぶ」ことにより、特定の列の値で結び付けられた(結合された)レコードの内容をそれぞれのテーブルから抽出することができます。
 この抽出内容については結合プロパティというプロパティの設定により変更することができ、特定の列の値で結び付けられていないレコードの内容も一緒に抽出できるようになります。
 …といっても意味がわかりにくいですので、まずは設定と結果の実例を見てから補足をしたいと思います。

結合プロパティの設定

f:id:accs2014:20180623140320p:plain:right:w400

 サンプルとして2つのテーブルを用います。
 1つ目がこちらの部署テーブルです。


f:id:accs2014:20180623140323p:plain:right:w400

 2つ目がこちらの社員テーブルです。
 この2つのテーブルに共通する「部署コード」列の値を比較することで社員の所属状況を知ることができますが、部署に所属していない、つまり部署コードが記録されていない社員が2名いる(社員コードが11,12の者)のがわかります。
 また、部署テーブルを見直してみると、社員が所属していない部署が1つある(部署コードが6 の部署)こともわかります。


f:id:accs2014:20180623140317p:plain:right:w500

 まずは普通の選択クエリを作ります。
 2つのテーブルを置き、両方のテーブルを線で結びます(一方の「部署コード」からもう一方の「部署コード」までドラッグ)。
 そしてデザイングリッド(下部)で、表示させようとする列名を選択します。


f:id:accs2014:20180623140315p:plain:right:w400

 データシートビューです。
 「部署コード」の値により結び付けられたレコードだけが抽出されますので、社員のいない部署のデータは表示されませんし、部署に属していない社員のデータも表示されません。


f:id:accs2014:20180623140312p:plain:right:w500

 さて、デザインビューに戻り、テーブルを結んでいる「線」を右クリックするとメニューが現れます。
 ここで「結合プロパティ」というメニューを選択します。


f:id:accs2014:20180623145804p:plain:right:w500

 するとウインドウが現れます。
 ここで注目すべきなのは下部の3つの選択肢です。
 デフォルトで「1: 両方のテーブルの結合フィールドが同じ行だけを含める。」という項目が選択されています。
 意味合いについては見てきたとおりですが、2つのテーブルを結び付けているそれぞれの列(結合フィールド、つまり両方のテーブルの「部署コード」)を比較し、両方に同じ値が存在するレコードだけを抽出する、ということを表しています。


f:id:accs2014:20180623140417p:plain:right:w500

 さて、ここで2番目の選択肢「2: '部署テーブル'の全レコードと'社員テーブル'の同じ結合フィールドレコードだけを含める」を選択してみます。
 パッと見では意味がわかりにくいですが「'部署テーブル'の全レコード」というところからわかるように、部署テーブルのレコードについては必ずすべてのレコードが抽出されるようになります。


f:id:accs2014:20180623140414p:plain:right:w500

 OKをクリックすると、先ほどと少し変わって、線の右端、社員テーブルに接している部分が矢印状になります。


f:id:accs2014:20180623140412p:plain:right:w400

 データシートビューです。
 最初のクエリで抽出されていた内容に加え、社員がいない部署(社員テーブルと、部署コードの値により結びつけられていない部署)のレコードも併せて抽出されます。
 結果的に部署テーブルのレコードはすべて抽出されています。ただし社員がいない部署についえては、社員コードと氏名の列はNullとなります。


f:id:accs2014:20180623140409p:plain:right:w500

 再びデザインビューです。
 同じように結合フィールドウインドウを開き、今度は「3: '社員テーブル'の全レコードと'部署テーブル'の同じ結合フィールドレコードだけを含める」を選択してみます。
 パッと見では意味がわかりにくいですが「'社員テーブル'の全レコード」というところからわかるように、社員テーブルのレコードについては必ずすべてのレコードが抽出されるようになります。


f:id:accs2014:20180623140406p:plain:right:w500

 OKすると、今度は所属テーブルに接している部分が矢印状になります。


f:id:accs2014:20180623140450p:plain:right:w400

 データシートビューです。
 最初のクエリで抽出されていた内容に加え、部署に所属していない社員(部署テーブルと、部署コードにより値で結びつけられていない社員)のレコードも併せて抽出されます。
 結果的に社員テーブルのレコードはすべて抽出されています。ただし所属する部署がない社員については、部署コードと部署名の列はNullとなります。


内部結合と外部結合

 さて、結合プロパティの設定による3種のクエリの例をみてみました。
 このうち最初のもの、つまり通常の結合クエリの結合の仕方は「内部結合」と呼ばれます。
 一方、2番目と3番目の結合の仕方は「外部結合」と呼ばれます。Accessのメニュー等には現れませんがぜひ覚えておいてください。
 ところで、外部結合は2種あるわけですが、一方が「左外部結合」、もう一方が「右外部結合」に分類されます。結合プロパティの設定ではどちらが左外部結合でどちらが右外部結合なのかは区別がつきませんし、区別する必要もありませんが、下記の参考記事でも触れていますので興味のある方はご覧ください。

まとめ

 外部結合は、一方のテーブルの一覧をメインとしながら関連情報も併せて表示したい、といった場合に用いられます。上記の例でいえば「部署の一覧とともに所属している社員を表示したい」というときに、2番目のようなクエリが用いられます。
 このようなニーズはとても多く、外部結合はグループ化集計などと同様に多用されますので、必ず覚えておいていただきたいと思います。

 ところで、勘の鋭い方は上記の2番目のクエリと3番目のクエリを合わせたようなクエリ(つまり、社員のいない部署と部署に属さない社員を含めてすべて表示するようなもう一つの外部結合)も存在するのではないか、と思われるかもしれません。
 実はこれも可能で、一般には「完全外部結合」と呼ばれますがが、Accessではメニューから作成することはできず、ちょっと工夫する必要があります。次の記事で紹介していますので参考まで。

www.accessdbstudy.net