Accessのサブクエリの使い方をお探しですね。

広告

Accessのサブクエリを使いこなそう!複雑なデータ抽出・更新がラクになる方法

Accessでデータベースを管理していると、「別のテーブルの集計結果をもとにデータを絞り込みたい」「他のテーブルの最新データを使って一括更新したい」といった場面に出くわすことがありますよね。

こんなちょっと複雑な処理を実現するために役立つのが、「サブクエリ(副問い合わせ)」というテクニックです。

この記事では、Accessでサブクエリを作る基本から、実際の仕事ですぐに使える具体例まで、わかりやすく解説していきます。

1. サブクエリって何?Accessでの基本的な仕組み

サブクエリ(副問い合わせ)を簡単に説明すると、「メインのSQL文の中に入れ子で組み込まれた、もう一つのSQL文」のことです。

Accessでデータを扱うとき、普通はクエリデザインやシンプルなSQLでデータを取り出しますが、単純なテーブル操作だけでは目的のデータが取れないことってよくありますよね。

例えば、「平均売上より高い売上を出している顧客だけをリストアップしたい」という場合を考えてみましょう。

この場合、まず平均売上を計算するクエリ(サブクエリ)を実行して、その結果を条件にしてメインのクエリを動かす必要があります。

こんなふうに、クエリの中に別のクエリを入れ込むことで、わざわざ一時的なビューを作る手間が省けて、1つのクエリだけで複雑な処理が完結できる—これがサブクエリの一番の魅力なんです。

Accessでサブクエリが実行される流れは、基本的に「内側から外側へ」という順番になります。

まずカッコで囲まれたサブクエリの部分が実行されて、仮のデータセットや単一の値が作られます。

そして、その結果を使って外側のメインクエリが最終的なデータ抽出や更新を行うわけです。

この仕組みのおかげで、あらかじめ別のクエリを保存しておかなくても、必要なときに動的にデータを参照できるようになります。

また、サブクエリはSELECT句、FROM句、WHERE句など、SQL文のいろんな場所で使えます。

書く場所によって、1つの値を返したり、複数の値のリストとして働いたり、仮想的なテーブルのように振る舞ったりと、役割が柔軟に変わるんです。

だからこそ、目的に合わせて正しい書き方を理解することが大切になってきます。

2. Accessでサブクエリを作る基本的な手順と書き方

Accessでサブクエリを作る方法には、大きく分けて2つのやり方があります。

1つは「SQLビュー」で直接コードを書く方法、もう1つは「クエリデザイン」の抽出条件欄にサブクエリを埋め込む方法です。

SQLビューを使う場合は、一般的なSQLの文法に従って、メインクエリのWHERE句やFROM句の中にカッコで囲んだSELECT文を書き込みます。

例えば、WHERE句で使うなら「WHERE 部署ID IN (SELECT 部署ID FROM 部署テーブル WHERE 部署名 = ‘営業部’)」といった感じです。

直接SQLを書く方法は、全体の構造が見やすくて、複雑な入れ子(ネスト)や相関サブクエリを作るときにとても便利です。

最初は難しく感じるかもしれませんが、一般的なSQLの知識がそのまま使えるので、覚えておくと応用が利きやすいというメリットがあります。

一方で、Accessならではの直感的な操作ができる「クエリデザイン」を使ってサブクエリを組み込むこともできます。

デザイングリッドの「抽出条件」のセルに、直接「(SELECT 部署ID FROM 部署テーブル WHERE 部署名 = ‘営業部’)」といったSQL文を入力すれば、GUIの使いやすさを保ちながらサブクエリの便利な絞り込み機能が使えます。

ただし、クエリデザイン上であまり複雑なサブクエリを入力すると、Accessが自動的にSQL文を解釈・整形しようとして、意図しないカッコやテーブル結合が勝手に追加されてしまうことがあるんです。

なので、まずはSQLビューで正確な構文を作って、テスト実行して正しい結果が出ることを確認してから、必要に応じてデザインビューと行き来する、という手順で進めるのがエラーを防ぐコツになります。

3. 実務で役立つ!Accessでのサブクエリ活用事例(抽出・集計編)

実際の仕事でサブクエリがよく使われるのが、WHERE句の「IN」や「EXISTS」を使った高度なデータ抽出です。

例えば、特定の条件を満たす別テーブルのリストをもとにメインのテーブルを絞り込みたいとき、IN句を使うととてもシンプルに書けます。

「過去1年間に注文履歴がある顧客」を抽出したいなら、注文テーブルから該当する顧客IDをサブクエリで取得して、それを顧客テーブルのWHERE句で「顧客ID IN (サブクエリ)」として指定すればOKです。

さらに、データ量が多い場合や、複数の条件を組み合わせたいときには、EXISTS句を使った相関サブクエリが効果的です。

EXISTS句は、サブクエリ内に該当するレコードがあるかどうか(あるかないか)だけを判定するので、処理速度の面で有利になることが多く、実務でパフォーマンスを上げたいときにも重要なテクニックになります。

もう1つの便利な使い方が、SELECT句の中にサブクエリを書いて、レコードごとに個別の集計値を並べて表示する方法です。

これは「相関サブクエリ」と呼ばれる技術で、メインクエリの1行が処理されるたびに、サブクエリがメインクエリの値を参照しながら実行されます。

例えば、社員一覧を表示するクエリで、各社員の「最新の営業成績」や「所属部署の合計売上」を同時に表示させたいときに役立ちます。

テーブル結合(JOIN)を使っても似たような結果は得られますが、集計の単位が違うデータを無理に結合すると、レコードが重複してしまうリスクがあるんです。

SELECT句で相関サブクエリを使えば、メインクエリの行数を保ったまま、別の軸で集計した単一の値を安全に取得して列として表示できるので、複雑なレポート作成やダッシュボード用のデータ準備にとても重宝します。

4. データの一括変更に便利!サブクエリを使った更新クエリの事例

サブクエリはデータの抽出だけでなく、既存のデータを一括で変更する「UPDATE文(更新クエリ)」でも大活躍します。

Accessの実務でよくあるのが、「別のテーブルに保存されている最新の価格マスターを参照して、商品テーブルの価格を一気に更新したい」といったケースです。

こんなとき、UPDATE文のSET句やWHERE句にサブクエリを組み込めば、手作業でコピー&ペーストしたり一時テーブルを作ったりしなくても、安全で正確にデータを書き換えられます。

例えば、WHERE句にサブクエリを使って「変更対象のレコード」だけを正確に絞り込めば、誤って関係ないデータまで更新してしまう、という重大なミスを防ぐことができます。

ただし、AccessのSQLでサブクエリを使った更新処理をするときには、Access特有の仕様に注意が必要です。

一般的なデータベースシステムでは、SET句の中で直接サブクエリを使って値を代入することが簡単にできますが、Accessのデータベースエンジンでは、更新クエリの中に複雑なサブクエリや集計処理を入れると「更新可能なクエリである必要があります」というエラーが出て、処理がブロックされることがあります。

この問題を回避するには、DLookup関数を代わりに使ったり、サブクエリではなくINNER JOINを使った更新クエリに書き換えたりする工夫が必要になります。

サブクエリのロジック自体はデータを特定するのにとても便利なので、まずはSELECTクエリとして対象レコードと更新値が正しく出力されるかを確認して、その安全なロジックを更新クエリに応用する、という慎重なやり方で進めるのがデータベース管理の鉄則です。

広告