<テーブル結合の種類>
・内部結合 --------- 結合したフィールドに共通のデータのみが両テーブルから抽出される。 ・外部結合 |--左外部結合 -- 左側のテーブルにある全レコードと、結合したフィールドと共通する右側のデータが抽出される。 |--右外部結合 -- 右側のテーブルにある全レコードと、結合したフィールドと共通する左側のデータが抽出される。 ---全外部結合 -- 結合したフィールドに共通のデータと、共通しない全レコードが両テーブルから抽出される。
一例を紹介しよう。まず、支社Aと支社Bのテーブルがある。このテーブルは同じ構造をしており、それぞれで顧客CDと売掛金を管理している。また、顧客CDは両支社で共通のコードを使っている。
![]() |
![]() |
支社Aテーブル | 支社Bテーブル |
テーブル内のデータを見ると、両支社では共通の顧客と異なる顧客を持っている。ここで、共通の顧客のみを抽出して売掛金を見るには、内部結合を使えばよい。では、両者に含まれるすべての顧客を表示して売掛金一覧表を作るにはどうすればいいだろうか。
左/右外部結合をしても、片方だけしか全レコードを表示できない。
![]() |
![]() |
![]() |
内部結合 | 左外部結合 | 右外部結合 |
作りたい表は下記のようにすべての顧客と売掛金額を表示した売掛金一覧表である。
![]() |
売掛金一覧表 |
なんとなく、左/右外部結合が一緒になったようなクエリーだ。顧客CD 0001/0004/0008については両テーブル共通なため、両方の売掛金が同一のレコードに表示されている。共通していない顧客CDについてもすべて表示されており、対応する売掛金も両テーブルのレコードが全部表示されている。
結合したフィールド同士は内部結合のごとく共通して表示し、そこから外れたレコードは左右のテーブルとも全部表示する外部結合を「全外部結合」という。
残念ながら、Accessの標準環境では全外部結合を使用できない。なぜなら、Accessが使用する「Jet SQLエンジン」が全外部結合のSQL(FULL JOIN)に未対応なためだ(Microsoft SQL Serverを利用するなら可能)。
そこで、Accessで全外部結合を使うには、面倒だがクエリを4つ作ってそれをシミュレートする必要がある。だが、このテクニックを覚えれば、一覧表の作成がクエリだけで行えるため、実行速度のアップにつながる。覚えて損はない。
全外部結合を作る場合は、結合のキーとなるフィールドのみのユニオンクエリを作成する(ユニオンクエリの作り方はヘルプを参照)。
<SQL文>
SELECT 顧客CD FROM 支社A UNION SELECT 顧客CD FROM 支社B;
![]() ![]() |
ユニオンクエリ |
出来上がった表を見ると、売掛金一覧表の顧客CDフィールド部分と同じレコードが並んでいることが分かる。つまり、ユニオンクエリでは結合キーとなるフィールドの全データを、重複なしに抽出する作業を行えばよい。
![]() ![]() |
![]() ![]() |
支社Aとユニオンクエリを左外部結合 | 支社Bとユニオンクエリを左外部結合 |
出来上がった表を見ると、売掛金一覧表を支社A・支社Bで分けたレコードになっていることが見て取れる。
![]() ![]() |
合体して全外部結合を作成 |
これで全外部結合の完成である。あとはフィールド名をいじれば、目的の売掛金一覧表と同じものになる。なお、売掛金額フィールドの空欄はNULL値なので、0を入れたい場合はNULLか否かIsNULLで判定してやるとよい。