Accessのクエリで結合する方法をお探しですね。

広告

Accessのテーブル結合を分かりやすく解説!内部結合とLeft Joinの違いとは

Accessで複数のテーブルを扱っていると、「顧客情報と注文履歴を一緒に見たい」「商品名を別のテーブルから引っ張ってきたい」なんて場面、よくありますよね。

そんなときに必要なのが、クエリでのテーブル結合です。

特に初心者がつまずきやすいのが、**内部結合と外部結合(Left Join)の違い**。

「結合したのにデータが消えた!」「思ったより件数が少ない…」なんて経験、ありませんか?

この記事では、Accessのテーブル結合の基本から、内部結合とLeft Joinの使い分け、実務で間違えやすいポイントまで、できるだけ分かりやすく説明していきます。

テーブル結合ってそもそも何?

Accessの**テーブル結合**とは、バラバラのテーブルに保存されているデータを、共通する項目をキーにして1つの表にまとめて表示する仕組みのことです。

たとえば、こんなケースを考えてみましょう。

– **顧客テーブル**には、顧客ID・顧客名・住所を保存
– **注文テーブル**には、注文ID・顧客ID・注文日・金額を保存

この2つには「顧客ID」という共通の項目がありますよね。

この顧客IDを手がかりに結合すれば、「誰が、いつ、いくら注文したのか」を一覧で見ることができます。

Accessでは、すべての情報を1つの巨大な表にまとめるのではなく、役割ごとにテーブルを分けて管理するのが基本です。

だからこそ、必要なときにクエリで結合して情報を引き出す考え方がとても大切なんです。

結合の設定方法は2通り

Accessでテーブルを結合するには、大きく2つの方法があります。

**①クエリデザイン画面で設定**
2つのテーブルを画面に追加して、共通するフィールド同士をドラッグして線で結びます。

この線をダブルクリックすると「結合プロパティ」が開いて、内部結合にするか外部結合にするかを選べます。

**②SQLビューで書く**
SQLで書く場合は、内部結合なら`INNER JOIN`、左外部結合なら`LEFT JOIN`を使います。

どちらの方法でも考え方は同じ。

「どの項目を基準に、どの範囲のデータを表示するか」を決めているだけです。

内部結合とは?一致するデータだけを表示

**内部結合**は、結合条件に一致するレコードだけを表示する結合方法です。

Accessでテーブル同士を普通に結ぶと、たいていは内部結合になります。

具体例で理解しよう

– 顧客テーブルには「顧客ID:1、2、3」がある
– 注文テーブルには「顧客ID:1、2」の注文だけがある

この2つを内部結合すると、結果に表示されるのは**顧客ID:1と2だけ**です。

顧客ID:3は顧客テーブルには存在しますが、注文テーブルに対応する注文がないため、**結果から消えてしまいます**。

つまり内部結合は、「**両方のテーブルに関連データがあるものだけを見たい**」ときに使う結合なんです。

SQLで書くとこんな感じ

“`sql
SELECT 顧客.顧客名, 注文.注文日, 注文.金額
FROM 顧客
INNER JOIN 注文
ON 顧客.顧客ID = 注文.顧客ID;
“`

このクエリでは、顧客IDが一致する行だけを結合しています。

結果として、**注文がある顧客だけが表示**され、注文がない顧客は表示されません。

売上明細や受注履歴など、**実際に発生した取引だけを対象にしたい**ときには内部結合がぴったりです。

ただし、「注文していない顧客も一覧で見たい」「未登録のデータを確認したい」という目的には向きません。

内部結合は便利ですが、**一致しないデータを見落としやすい**点に注意が必要です。

Left Joinとは?左側のテーブルを全件残す結合

**外部結合**は、結合条件に一致しないレコードも含めて表示できる結合方法です。

Accessで特によく使うのが**左外部結合**、つまり**Left Join**です。

Left Joinの仕組み

Left Joinでは、SQLの`FROM`句で左側に書いたテーブル(クエリデザインなら基準にした側)のレコードを**すべて表示**します。

一致するデータが右側のテーブルにあれば結合して表示し、なければその部分は空欄(Null)になります。

たとえば、顧客テーブルを左側、注文テーブルを右側にしてLeft Joinすると、**注文がある顧客だけでなく、まだ注文していない顧客も一覧に表示**できます。

SQLで書くとこうなります

“`sql
SELECT 顧客.顧客名, 注文.注文日, 注文.金額
FROM 顧客
LEFT JOIN 注文
ON 顧客.顧客ID = 注文.顧客ID;
“`

このクエリでは、顧客テーブルの全レコードが結果に残ります。

– 注文がある顧客→注文日や金額も表示される
– 注文がない顧客→注文日や金額が**Null(空欄)**になる

このNullを利用すると、「**注文がない顧客だけを抽出する**」といったこともできます。

たとえば「注文.顧客ID が Null」という条件を追加すれば、顧客マスタには登録されているのに注文履歴がない顧客を調べられます。

これは、データの欠損確認や未対応リストの作成、マスタ登録漏れのチェックなど、Accessの実務でとてもよく使われるテクニックです。

内部結合とLeft Joinの違い・使い分け・注意点

一番の違いは「一致しないデータを残すかどうか」

| 結合方法 | 表示されるデータ |
|———|—————-|
| 内部結合 | 両方のテーブルで一致したデータだけ |
| Left Join | 左側のテーブルは全件、右側は一致したものだけ |

たとえば、

– 「注文がある顧客だけを見たい」→**内部結合**
– 「注文がない顧客も含めて一覧を見たい」→**Left Join**

どちらが正しいというわけではなく、**目的によって選ぶ結合方法が変わる**んです。

Accessで「あれ、思ったより件数が少ないな?」と感じたら、内部結合によって一致しないデータが除外されていないか確認してみましょう。

使い分けの目安

| 目的 | 適した結合 |
|——|———–|
| 両方のテーブルに存在するデータだけ見たい | 内部結合 |
| 左側テーブルの全件を残して関連情報を付けたい | Left Join |
| 未登録・未処理・注文なしなどを探したい | Left Join+Null条件 |
| 売上明細や注文履歴など実績データだけ集計したい | 内部結合 |

Left Joinを使うときの注意点

①右側テーブルの条件指定に注意

Left Joinで顧客テーブルを左側、注文テーブルを右側にしたあと、注文テーブルの注文日に「2024/1/1以降」などの条件をそのまま設定すると、**注文がない顧客の注文日はNullなので、結果から除外されてしまう**ことがあります。

つまり、Left Joinにしたつもりでも、**条件の書き方によっては内部結合のような結果になる**場合があるんです。

注文がない顧客も残したいなら、Nullを含める条件にするか、先に注文テーブル側を別クエリで絞り込んでから結合するなど、工夫が必要です。

②データ型が一致しているか確認

顧客ID同士を結合する場合、一方が数値型でもう一方が短いテキスト型になっていると、正しく結合できなかったり、意図しない結果になったりします。

結合するフィールドのデータ型は必ず揃えましょう。

③重複データに注意

顧客1人に対して注文が3件ある場合、顧客情報は**3行に増えて表示**されます。

これはAccessの不具合ではなく、1対多の関係を結合した結果です。

集計したい場合は、結合後に**グループ化クエリ**を使うなど、表示したい粒度に合わせて調整しましょう。

まとめ:結合の基本を押さえれば怖くない!

Accessのテーブル結合は、最初は難しく感じるかもしれませんが、基本は次の2つの違いを押さえることです。

– **内部結合**:一致するものだけを見る→実績データの抽出に強い
– **Left Join**:左側を全件残す→欠損確認や未処理データの発見に強い

クエリデザイン画面で結合線のプロパティを確認して、「どちらのテーブルを基準にしたいのか」を意識すれば、思い通りの結果に近づけます。

Accessで集計クエリや更新クエリを作る前に、まず**結合結果が正しいかをデータシートビューで確認する**習慣をつけると、後々のミスを大きく減らせますよ。

ぜひこの記事を参考に、テーブル結合をマスターしてくださいね!

広告