- 「社員マスタ」テーブルと「TOEIC受験履歴」テーブルから、TOEICを受験していない社員のデータを抽出したい
- 「社員マスタ」テーブルと「TOEIC受験履歴」テーブルから、TOEICで600点以上を取れていない社員のデータを抽出したい
Accessで、上記の例のように、マスタ系のテーブルと明細系のテーブルを使って、条件を満たす明細が無いマスタレコードを抽出する場合、不一致クエリに慣れていないと、躓いたり誤ったりしてしまいます。
この記事では、上記のようなデータを抽出するクエリの作り方を、具体例を出しながら説明します。
明細テーブルにデータが存在しないレコードを抽出
例として、社員マスタテーブルとTOEIC受験履歴テーブルから、TOEICを受験していない社員のデータを抽出する方法を紹介します。
使用するテーブルは以下の2つです。


このデータから、TOEICを受験していない社員を抽出します。
まずは、単純に2つのテーブルを結合(外部結合)します。


クエリを実行すると、下図のようになります。TOEIC受験履歴にデータが無い社員(S02 健司)は、TOEICに関するフィールドがデータ無し(Null)になっています。

TOEIC未受験の社員のみを抽出したいので、TOEIC受験履歴がNullのレコードを抽出します。


結合先の明細テーブルにデータが存在しないレコードの抽出方法は以上です。
抽出条件にNullを設定するフィールドは、空白があり得ないフィールド(キー項目など)にしましょう。
たとえば、TOEIC受験履歴テーブルに備考フィールドがあるとして、そこだけに Is Nullの条件を付けてしまうと、受験したけど備考が空白の社員も抽出されてしまいます。
ちなみに、参考までにですが、SQLがわかる場合は、以下のように副問い合わせで実現することもできます。

Not In (SELECT 社員番号 FROM TOEIC受験履歴)

応用:明細テーブルに条件を満たすデータが存在しないレコードを抽出
ここからは応用編です。明細テーブルにデータは有るものの、条件を満たすデータは無いレコードを抽出してみます。
例として、社員マスタテーブルとTOEIC受験履歴テーブルから、TOEICで600点以上のスコアを取れていない社員のデータを抽出する方法を紹介します。
まずは、600点以上のTOEIC受験履歴を抽出する中間クエリを作ります。


あとは、社員マスタと、このクエリ(TOEIC600点以上)を結合し、先ほどと同様に、TOEIC600点以上の社員番号がNullのレコードを抽出すればOKです。


以上で、TOEICで600点以上のスコアを取れていない社員のデータを抽出することができました。
ちなみに、参考までにですが、SQLがわかる場合は、以下のように副問い合わせで実現することもできます。

Not In (SELECT 社員番号 FROM TOEIC受験履歴 WHERE 点数 >= 600)

コメント