Microsoft Accessで全外部結合をシミュレートする方法

初出:2003/03/05
改定:2003/03/05

1.全外部結合って何?

 クエリーでテーブル同士を結合する場合、「内部結合」と「外部結合」の2種類がある。さらに外部結合には「左外部結合」「右外部結合」そして「全外部結合」の3種類がある。

<テーブル結合の種類>

・内部結合 --------- 結合したフィールドに共通のデータのみが両テーブルから抽出される。
・外部結合
  |--左外部結合 -- 左側のテーブルにある全レコードと、結合したフィールドと共通する右側のデータが抽出される。
  |--右外部結合 -- 右側のテーブルにある全レコードと、結合したフィールドと共通する左側のデータが抽出される。
  ---全外部結合 -- 結合したフィールドに共通のデータと、共通しない全レコードが両テーブルから抽出される。

 一例を紹介しよう。まず、支社Aと支社Bのテーブルがある。このテーブルは同じ構造をしており、それぞれで顧客CDと売掛金を管理している。また、顧客CDは両支社で共通のコードを使っている。

支社Aテーブル 支社Bテーブル
支社Aテーブル 支社Bテーブル

 テーブル内のデータを見ると、両支社では共通の顧客と異なる顧客を持っている。ここで、共通の顧客のみを抽出して売掛金を見るには、内部結合を使えばよい。では、両者に含まれるすべての顧客を表示して売掛金一覧表を作るにはどうすればいいだろうか。
 左/右外部結合をしても、片方だけしか全レコードを表示できない。

内部結合 左外部結合 右外部結合
内部結合 左外部結合 右外部結合

 作りたい表は下記のようにすべての顧客と売掛金額を表示した売掛金一覧表である。

売掛金一覧表
売掛金一覧表

 なんとなく、左/右外部結合が一緒になったようなクエリーだ。顧客CD 0001/0004/0008については両テーブル共通なため、両方の売掛金が同一のレコードに表示されている。共通していない顧客CDについてもすべて表示されており、対応する売掛金も両テーブルのレコードが全部表示されている。

 結合したフィールド同士は内部結合のごとく共通して表示し、そこから外れたレコードは左右のテーブルとも全部表示する外部結合を「全外部結合」という。

 残念ながら、Accessの標準環境では全外部結合を使用できない。なぜなら、Accessが使用する「Jet SQLエンジン」が全外部結合のSQL(FULL JOIN)に未対応なためだ(Microsoft SQL Serverを利用するなら可能)。
 そこで、Accessで全外部結合を使うには、面倒だがクエリを4つ作ってそれをシミュレートする必要がある。だが、このテクニックを覚えれば、一覧表の作成がクエリだけで行えるため、実行速度のアップにつながる。覚えて損はない。



2.Accessで全外部結合をシミュレート

 概要を説明すると、まず結合のキーとなるフィールドのみでユニオンクエリを作成し、次にそれと各テーブルを外部結合し、最後に内部結合で合体する、というものだ。以下に詳細な手順を示す。

1.ユニオン クエリを作成する

 ユニオンクエリとは、複数のテーブル同士で共通するフィールドを合体して1つのテーブルを作るクエリのことである(詳しくはヘルプを参照)。例えば支社Aと支社Bならば、顧客CDが共通しているので、ユニオンクエリを作ることで両方のテーブルに含まれる顧客CDを1つのテーブルにまとめることができる。

 全外部結合を作る場合は、結合のキーとなるフィールドのみのユニオンクエリを作成する(ユニオンクエリの作り方はヘルプを参照)。

<SQL文>

SELECT 顧客CD FROM 支社A
UNION
SELECT 顧客CD FROM 支社B;

ユニオンクエリのSQL
ユニオンクエリ
ユニオンクエリ

 出来上がった表を見ると、売掛金一覧表の顧客CDフィールド部分と同じレコードが並んでいることが分かる。つまり、ユニオンクエリでは結合キーとなるフィールドの全データを、重複なしに抽出する作業を行えばよい。

2.左外部結合クエリを作成する

 次に、作成したユニオンクエリと支社A・支社Bテーブルをそれぞれ左外部結合したクエリを作成する。

支社Aとユニオンクエリを左外部結合(デザイン)
支社Aとユニオンクエリを左外部結合
支社Bとユニオンクエリを左外部結合(デザイン)
支社Bとユニオンクエリを左外部結合
支社Aとユニオンクエリを左外部結合 支社Bとユニオンクエリを左外部結合

 出来上がった表を見ると、売掛金一覧表を支社A・支社Bで分けたレコードになっていることが見て取れる。

3.クエリ同士を合体して全外部結合を作成

 最後に、作成した外部結合クエリ同士を内部結合して合体する。

内部結合で合体(デザイン)
内部結合で合体
合体して全外部結合を作成

 これで全外部結合の完成である。あとはフィールド名をいじれば、目的の売掛金一覧表と同じものになる。なお、売掛金額フィールドの空欄はNULL値なので、0を入れたい場合はNULLか否かIsNULLで判定してやるとよい。



3.まとめ

 いかがだろうか。クエリはたくさん必要になるが、作り方はいたってシンプルだ。ただし、上記の例はフィールドが2つしかない最低限のテーブルなのでスムースに完成したが、実際はもっとたくさんのフィールドがあるはずなので、すんなりと作成できない場合もある。そのあたりは各自工夫してほしい。例えば、上記の例で顧客CDに対応した顧客名を持つ「顧客テーブル」がある場合、顧客CDと結合するタイミングは全外部結合したクエリと行うのがよい。

表紙へ


Copyright © 2003 H'Imagine.
All rights reserved.