Accessのクエリ:3種類の結合の違いについて
Accessのクエリでは、複数のテーブルを結合して作る為の「リレーションシップ」と呼ばれる機能があります。この機能を用いることで、複数のテーブルを同じキー(例えば社員ID)を用いて結合し、ガッチャンコした状態で新たなクエリを作ることができます。
例えば商品マスターと売上マスターを結合させて、売上マスタに商品情報を加えた状態のクエリを作るなどがこれで可能になるわけです。しかし、この結合には3種類存在し、きちんと把握した状態で結合をしないと、データの取りこぼしを招く恐れがありますので、今回はそこを解説してみたいと思います。
今回使用するサンプルファイル
- 結合サンプル - Access2016で作成されています
2つのテーブルと3種類のクエリを作り込んであります。
結合の種類と内容
今回のサンプルはわかりやすくする為に、マスタおよびサブマスタの両方のテーブルに於いて、「施設名カナ」をキーにして、両方のテーブルを結合。両方のテーブルデータを結合して抽出しています。
内部結合
いわゆる完全結合です。2つのテーブル(マスタとサブマスタ)の関係に於いて、両方にキー(例えば社員ID)を基準に「同じデータが存在する」場合に、それらをピックアップして表示します。片方のテーブルにしかないデータについては、クエリの結果に表示されません。非常によく使うパターンですが、データを取りこぼす可能性もあります。
図:テーブル間は矢印のない結合で結ばれている
図:両方に同一キーを持つレコードだけが抽出される
左外部結合
LEFT JOINと呼ばれますが、マスター側の全データを表示し、サブマスタ側のデータは存在するものがあればピックアップして来てくれます。マスター側のデータの取りこぼしはありませんが、サブマスタ側にだけある施設名が存在する場合、そのデータはヒットしないので、取りこぼす可能性はあります。
図:サブマスタにだけあるデータは表示されない
図:マスタにだけある場合、商品名が空白になってる
右外部結合
RIGHT JOINと呼ばれますが、サブマスタ側にあるデータは全表示されます。よって、マスタ側に登録のないデータはこの場合、施設名が空白の状態で表示されます。マスター側のデータを取りこぼすことにはなりますが、空白があることで「おかしなデータがある」ことをユーザは検知できるので、取りこぼしは少なくなります。
図:マスタにないデータは空白で表示される事になる
図:施設名が空白のレコードがマスタ側に登録のないデータ
結合の作り方
結合の選択
クエリ作成画面に於いて、以下のような手順で上記の3種類の結合を作成することが可能です。
- 空のクエリデザイン作成画面に於いて、マスタおよびサブマスタを追加する
- マスター側施設名カナを掴んで、サブマスター側施設名称へドラッグアンドドロップする(この段階で内部結合は完成する)
- 結合された線をダブルクリックする
- 結合の種類が出てくるので、2個目を選ぶと左外部結合となる
- おなじく3個目を選ぶと右外部結合となる
- 一方向に対して矢印が出て、結合は完成する。OKを押す事で完成する
図:ダイアログ内で結合の種類を選択する
クエリの作成
結合が完了したら両方のテーブルからフィールドを掴んで、下のパネルに離す事でクエリの列のデザインを決められます。しかし、闇雲につかめば良いというものでもなく、以下のルールを元に必要な列を掴んでポイしましょう。
- マスター側からはIDやキーにした列など主要なデータを掴んで入れる
- サブマスター側からは、キーにした列以外で表示したいサブマスタデータの列だけを厳選して入れる。ID列などは通常必要ない。
- またマスタ側にもあってサブマスタ側にもある、キー以外で同じようなデータについては、マスタ側のだけを入れれば十分である。
図:マスタをベースにし、サブマスタからは必要な列だけピックアップ