- Accessのクエリでテーブルを結合する基本操作が分かる
- 結合プロパティとINNER JOIN / LEFT JOIN / RIGHT JOINの違いを理解できる
- 結合できないときの確認ポイントや複数フィールド結合の考え方が分かる
Accessで複数のテーブルに分かれたデータを一つのクエリで確認したいときは、共通フィールドでテーブルを結合します。
この記事の「結合」は、部品IDなどが一致する行を関連付けるテーブル結合(JOIN)です。
値をつなげる文字列結合や、結果を縦に並べるユニオンクエリとは別の操作です。
クエリデザインでの結合手順と、内部結合・外部結合の選び方を順に確認しましょう。
選択クエリの基本操作から確認したい方は、当サイトの別記事を参照してください。
【Accessクエリ入門】1回目-デザインビューで選択クエリを作る
もくじ
Accessのクエリでテーブルを結合するとは
「部品マスタ」に部品名、「発注伝票明細」に発注数量が保存され、両方に部品登録IDがあるとします。
このIDを結合フィールドにすれば、部品名と発注数量を一つのクエリで表示できます。
一致するデータだけを見るのか、発注されていない部品も残すのかによって、内部結合と外部結合を使い分けます。
学習用のデータベースはこちらからダウンロードしてください。
データベースを開くと「クエリ1」が用意されています。
デザインビューで開き、テーブル間の結合線を確認します。
テーブルを結合する基本手順と結合プロパティ
新しいクエリで結合を作る場合は、次の手順で操作します。
「クエリ1」のように結合線がすでにある場合は、手順4から確認できます。
- [作成]タブから[クエリ デザイン]を開き、結合したいテーブルまたはクエリを追加
- 一方の共通フィールドを、もう一方の対応するフィールドへドラッグ
- 結合線が表示されたら、結果に必要なフィールドをデザイングリッドへ追加
- 結合線を右クリックして[結合プロパティ]を開き、表示方法を選択
- データシートビューへ切り替え、期待したレコードが表示されるか確認
結合線を右クリックすると、結合プロパティを表示できます。
結合プロパティ画面で、3つのプロパティ設定のいずれかを選択します。
表示される3つの設定は、SQLのJOINと次のように対応します。
ここでは、マスタ側テーブルを左と想定しています。
| 設定 | 種類 / SQL | 表示されるレコード | 用途 |
|---|---|---|---|
| 1 | 内部結合 / INNER JOIN | 両方で一致するレコードのみ | 関連データの通常の一覧 |
| 2 | 左側外部結合 / LEFT JOIN | 左側は全件、右側は一致分のみ | マスタにある未使用データの確認 |
| 3 | 右側外部結合 / RIGHT JOIN | 右側は全件、左側は一致分のみ | 右側を基準にした欠落確認 |
プロパティの2と3を選ぶ前に、結合プロパティに表示される左側・右側のテーブル名の確認を忘れないでください。
内部結合を設定する
結合のデフォルト設定は内部結合で、部品登録IDが両テーブルに存在する行だけが表示されます。
両方のテーブルに存在するデータだけを見たい場合は内部結合を選びます。
たとえば「発注明細に登録されている部品について、部品マスタの正式な部品名も一緒に表示したい」という一覧では、明細に存在しない部品まで表示する必要がないため内部結合が向いています。
反対に、片方にしかないデータも確認したい場合は外部結合を使います。
未発注の部品や、マスタに存在しない明細を探す場合は、次の外部結合の考え方で確認します。
左外部結合・右外部結合を設定する
外部結合は、指定した側のテーブルを全件残す結合です。
部品マスタにはあるものの、発注伝票明細にはない部品を探す場合は、部品マスタを残す左外部結合を設定します。
結合プロパティで2番目の「T01部品マスタの全レコードに・・・」を選択します。
この設定が LEFT JOIN に対応します。
設定後、結合線は矢印で表示されます。
結果には発注伝票側に一致する行がない部品も残り、伝票側のフィールドは空欄(Null)になります。
これにより、発注されたことのない部品を確認できます。
右側を全件残す場合は3番目を選びます。
SQLでは RIGHT JOIN にあたり、矢印の向きも逆になります。
サンプルでは「T01部品マスタ」が左側のテーブルです。
左右を迷ったときは、結合プロパティの表示を確認しましょう。
完全外部結合相当の結果を表示する
両方のテーブルについて、一方にしか存在しないレコードも含めたい処理は完全外部結合(FULL OUTER JOIN)です。
Accessのクエリでは FULL OUTER JOIN を直接指定できないため、左右の結果を組み合わせて再現します。
SQL Serverなど他のRDBMSでは FULL OUTER JOIN を使える場合があります。
ただしAccessではそのまま実行できないため、ここでは LEFT JOIN と UNION を組み合わせます。
- 左外部結合で、部品マスタの全レコードと一致する伝票を取得する
- 反対側から結合し、部品マスタに一致しない伝票だけを取得する
- 2つの結果を UNION でまとめる
サンプルのテーブル名でSQLビューに記述する場合は、次のようになります。
1つ目の SELECT は部品マスタ側を基準に取得し、2つ目の SELECT は発注伝票明細側を基準に取得します。
SELECT T01部品マスタ.品名 AS 部品マスタ側, T02発注伝票明細.品名 AS 発注伝票側
FROM T01部品マスタ LEFT JOIN T02発注伝票明細 ON T01部品マスタ.部品登録ID = T02発注伝票明細.部品登録ID
UNION SELECT T01部品マスタ.品名 AS 部品マスタ側, T02発注伝票明細.品名 AS 発注伝票側
FROM T02発注伝票明細 LEFT JOIN T01部品マスタ ON T02発注伝票明細.[部品登録ID] = T01部品マスタ.[部品登録ID]
WHERE T01部品マスタ.部品登録ID Is Null;
最後の WHERE T01部品マスタ.部品登録ID Is Null は、1つ目の SELECT ですでに取得した一致レコードを重複させないための条件です。
2つ目の結果から、部品マスタ側に一致しない「発注伝票明細にだけ存在するレコード」だけを取り出しています。
データシートビューに切り替えると、両テーブルの全データを確認できます。
VBAから利用するなど、一つのクエリにまとめたい場面でも扱いやすい方法です。
複数フィールド・複数テーブルを結合する
テーブル間には複数の結合条件を設定できます。
年度ごとに同じ部品IDが使われる設計なら、「部品ID」と「年度」の両方を結合し、異なる年度の明細が混ざるのを防ぎます。
デザインビューでは、1つ目の結合線を作ったあと、もう一方のフィールドも同じように対応するフィールドへドラッグして2本目の結合線を作成します。
結合線が2本表示されていることを確認してから、データシートビューで結果を確認してください。
複数フィールドでは、すべての条件が一致したレコードが結合されます。
3つ以上のテーブルを追加する場合も、まず2テーブルで結果を確認し、結合を一つずつ増やすと原因を追いやすくなります。
外部結合した相手側のフィールドに抽出条件を指定すると、空欄(Null)の行が除外されることがあります。
全件を残す目的のクエリでは特に注意してください。
Accessのクエリで結合できないときの確認ポイント
| 症状 | 確認すること | 対応 |
|---|---|---|
| 結合できない、型の不一致になる | フィールドのデータ型 | 数値と文字列など異なる型を結合していないか確認する |
| 一致するはずの行が出ない | フィールドと値 | 結合先の取り違え、Null、値の不一致を確認する |
| 外部結合なのに全件が残らない | 左右と抽出条件 | 残したい側を確認し、相手側の条件でNullを除外していないか見直す |
| 行数が増える | 結合先の重複 | 結合キーが一意でなければ複数行になることを確認する |
| 複数結合で結果が空になる | 各結合条件 | 条件を一つずつ戻し、すべて一致するデータがあるか調べる |
最初に内部結合で共通フィールドの一致を確かめ、必要になった段階で外部結合へ変更すると、原因を切り分けやすくなります。
JOINと文字列結合・ユニオンクエリの違い
| 操作 | 目的 | 例 |
|---|---|---|
| テーブル結合(JOIN) | 共通フィールドで関連する列を取り出す | 部品IDを基準に部品名と発注数量を表示する |
| 文字列結合 | 複数の値を一つの表示値にする | 姓と名をつなげて氏名を表示する |
| ユニオンクエリ(UNION) | 同じ列構成の結果を縦にまとめる | 年度別一覧を一つに並べる |
保存済みクエリ同士を共通フィールドでつなぐ場合も、JOINの考え方は同じです。
列を関連付けたいのか、行を追加したいのかで機能を選びましょう。
よくある質問
内部結合と外部結合はどう使い分けますか?
両テーブルで一致するデータだけが必要なら内部結合を選びます。
一方にしかないデータも確認したい場合は左外部結合または右外部結合を使います。
LEFT JOINで全レコードが表示されないのはなぜですか?
全件を残したいテーブルが左側かを結合プロパティで確認します。
また、右側フィールドへの抽出条件によってNullのレコードが除外されていないかを見直してください。
複数フィールドや保存済みクエリ同士も結合できますか?
どちらも可能です。複数フィールドを設定すると、すべての条件が一致した行が結合されます。
保存済みクエリを使う場合も、対応するフィールドとデータ型を確認しましょう。
JOINとユニオンクエリは同じですか?
異なります。
JOINは共通フィールドで列を関連付け、UNIONは同じ列構成の結果を縦方向に追加します。
まとめ
Accessのクエリでテーブルを結合するときは、共通フィールドで結合線を作り、結果に合わせて結合プロパティを選びます。
内部結合は一致分だけを表示し、左外部結合と右外部結合は指定した側の全レコードを残します。
データが表示されない場合は、データ型、結合方向、抽出条件、重複を確認してください。
基本の結合を理解すると、未発注部品の抽出や年度を含む複数フィールド結合にも応用できます。
本記事で解説したテーブル間結合の次に学習する内容としては、結果を縦にまとめるユニオンクエリ、集計クエリ、クロス集計クエリ、更新クエリ、追加クエリ、SQLビューの使い方を順に確認すると、Accessクエリで扱える処理の幅を広げやすくなります。