サブクエリを使ってクエリを別のクエリ内または式内に入れ子にする

あるクエリの結果を、別のクエリのフィールドや、クエリ フィールドの抽出条件として使いたい場合があります。たとえば、各商品の受注間隔を調べたいとします。この間隔を表示するクエリを作成するには、商品の各受注日を、同じ商品の他の受注日と比較する必要があります。これらの受注日の比較にも、クエリを使用する必要があります。このクエリをメイン クエリ内に入れ子にするには、サブクエリを使用します。

サブクエリは、式の中に記述することも、SQL ビューで構造化照会言語 (SQL) ステートメントに記述することもできます。

この記事の内容

クエリの結果を別のクエリのフィールドとして使用する

サブクエリをクエリ フィールドの抽出条件として使用する

サブクエリで使用できる共通の SQL キーワード

クエリの結果を別のクエリのフィールドとして使用する

サブクエリをフィールドのエイリアス (SQL)として使用できます。サブクエリの結果をメイン クエリのフィールドとして使用する場合は、サブクエリをフィールドの別名として使用します。

注: フィールドの別名として使用するサブクエリでは、複数のフィールドを返すことはできません。

サブクエリ フィールドの別名を使用すると、他の値に応じて変化する値を現在の行に表示できます。このような処理は、サブクエリなしでは実現できません。

例として、各商品の受注間隔を調べる例についてもう一度考えてみましょう。この間隔を調べるには、同じ商品の各受注日を比較する必要があります。ノースウィンド データベース テンプレートを使用して、この情報を表示するクエリを作成できます。

ノースウィンドのセットアップ方法

  1. [ファイル] タブの [新規作成] をクリックします。

  2. [使用できるテンプレート] の [サンプル テンプレート] をクリックします。

  3. [ノースウィンド] をクリックし、[作成] をクリックします。

  4. [Northwind Traders] ページ ([スタートアップ画面] タブ) の指示に従ってデータベースを開き、[ログイン ダイアログ] ウィンドウを閉じます。

  1. [作成] タブの [クエリ] で [クエリ デザイン] をクリックします。

  2. [テーブルの表示] ダイアログ ボックスで、[クエリ] タブをクリックし、[商品の受注] をダブルクリックします。

  3. [テーブルの表示] ダイアログ ボックスを閉じます。

  4. [商品 ID] と [受注日] をダブルクリックして、これらのフィールドをクエリ デザイン グリッドに追加します。

  5. グリッドの [商品 ID] 列の [並べ替え] 行で、[昇順] をクリックします。

  6. グリッドの [受注日] 列の [並べ替え] 行で、[降順] をクリックします。

  7. グリッドの 3 列目で、[フィールド] 行を右クリックし、ショートカット メニューの [ズーム] をクリックします。

  8. [ズーム] ダイアログ ボックスに、次の式を入力するか貼り付けます。

    前の日付: (SELECT MAX([受注日]) 
    FROM [商品の受注] AS [前の受注]
    WHERE [前の受注].[受注日] < [商品の受注].[受注日]
    AND [前の受注].[商品 ID] = [商品の受注].[商品 ID])

この式はサブクエリです。このサブクエリでは、それぞれの行について、その行に関連付けられている受注日より古い受注日のうち、最後の受注日が選択されます。AS キーワードでは、サブクエリの値とメイン クエリの現在行の値を比較できるように、テーブルの別名を作成しています。

  1. グリッドの 4 列目で、[フィールド] 行に次の式を入力します。

    間隔: [受注日]-[前の日付]

この式では、サブクエリで定義した前の日付の値を使用して、商品の各受注日と、同じ商品の前回の受注日との間の間隔を計算します。

  1. [デザイン] タブの [結果] で [実行] をクリックします。

    1. クエリが実行され、商品名、受注日、前の日付、および受注日と受注日の間の間隔が一覧で表示されます。結果は最初に "商品 ID" (昇順) で、次に "受注日" (降順) で並べ替えられています。

    2. 注: "商品 ID" はルックアップ フィールドなので、既定では、実際の商品 ID ではなくルックアップ値 (この例の場合は商品名) が表示されます。これにより、表示される値が変わりますが、並べ替え順序は変わりません。

  2. ノースウィンド データベースを閉じます。

ページの先頭へ

サブクエリをクエリ フィールドの抽出条件として使用する

サブクエリをフィールドの抽出条件として使用できます。サブクエリの結果を使用して、フィールドに表示される値を制限するには、サブクエリをフィールドの抽出条件として使用します。

たとえば、部署が第一営業ではない社員が処理した受注の一覧を確認したいとします。この一覧を生成するには、各受注の社員 ID を、第一営業以外の部署に属する社員の社員 ID の一覧と比較する必要があります。この一覧を作成してフィールドの抽出条件として使用するには、次の手順に示すようにサブクエリを使用します。

  1. "ノースウィンド 2007.accdb" を開き、コンテンツを有効にします。

  2. ログイン フォームを閉じます。

  3. [作成] タブの [その他] で [クエリ デザイン] をクリックします。

  4. [テーブルの表示] ダイアログ ボックスの [テーブル] タブで、[受注] および [社員] をダブルクリックします。

  5. [テーブルの表示] ダイアログ ボックスを閉じます。

  6. "受注" テーブルで、[社員 ID]、[受注 ID]、および [受注日] をダブルクリックしてクエリ デザイン グリッドに追加します。"社員" テーブルで、[部署] をダブルクリックしてデザイン グリッドに追加します。

  7. [社員 ID] 列の [抽出条件] 行を右クリックし、ショートカット メニューの [ズーム] をクリックします。

  8. [ズーム] ボックスに、次の式を入力するか、貼り付けます。

    IN (SELECT [ID] FROM [社員] 
    WHERE [部署]<>'第一営業')

    これはサブクエリです。このサブクエリによって、部署が "第一営業" ではないすべての社員の社員 ID が選択され、その結果セットがメイン クエリに渡されます。メイン クエリでは、"受注" テーブルの社員 ID が結果セットに含まれているかどうかを調べます。

  9. [デザイン] タブの [結果] で [実行] をクリックします。

    クエリが実行され、部署が第一営業ではない社員によって処理された受注の一覧がクエリ結果に表示されます。

ページの先頭へ

サブクエリで使用できる共通の SQL キーワード

サブクエリでは、いくつかの SQL キーワードを使用できます。

注: ここに示す一覧は完全なものではありません。サブクエリでは、データ定義キーワードを除く任意の有効な SQL キーワードを使用できます。

  • ALL    ALL は WHERE 句で使用します。サブクエリから返された行と比較して、それらのすべてに対して条件を満たす行を取得します。

たとえば、大学の学生のデータを分析するとします。各学生は最小成績平均値を維持する必要がありますが、この値は専攻によって異なります。ここでは、各専攻および対応する最小成績平均値が Majors という名前のテーブルに格納され、関連する学生情報が Student_Records という名前のテーブルに格納されているとします。

専攻名と、その専攻の最小成績平均値を超えている学生の一覧を表示するには、次のクエリを使用します。

SELECT [Major], [Min_GPA] 
FROM [Majors]
WHERE [Min_GPA] < ALL
(SELECT [GPA] FROM [Student_Records]
WHERE [Student_Records].[Major]=[Majors].[Major]);
  • ANY    ANY は WHERE 句で使用します。サブクエリから返された行と比較して、そのうちの 1 つ以上に対して条件を満たす行を取得します。

    たとえば、大学の学生のデータを分析するとします。各学生は最小成績平均値を維持する必要がありますが、この値は専攻によって異なります。ここでは、各専攻および対応する最小成績平均値が Majors という名前のテーブルに格納され、関連する学生情報が Student_Records という名前のテーブルに格納されているとします。

    専攻名と、その専攻の最小成績平均値を満たしていない学生の一覧を表示するには、次のクエリを使用します。

    SELECT [Major], [Min_GPA] 
    FROM [Majors]
    WHERE [Min_GPA] > ANY
    (SELECT [GPA] FROM [Student_Records]
    WHERE [Student_Records].[Major]=[Majors].[Major]);

    注: 同じ目的で SOME キーワードを使用することもできます。SOME キーワードは ANY の同義語です。

  • EXISTS    EXISTS は WHERE 句で使用して、少なくとも 1 行がサブクエリから返されるという条件を示します。EXISTS の前に NOT を指定して、サブクエリから 1 行も返されないという条件を示すこともできます。

    たとえば、次のクエリでは、少なくとも 1 つの既存の受注に含まれている商品の一覧が返されます。

    SELECT *
    FROM [商品]
    WHERE EXISTS
    (SELECT * FROM [受注明細]
    WHERE [受注明細].[商品 ID]=[商品].[ID]);

    NOT EXISTS を使用した場合は、既存のどの受注にも含まれていない商品の一覧が返されます。

    SELECT *
    FROM [商品]
    WHERE NOT EXISTS
    (SELECT * FROM [受注明細]
    WHERE [受注明細].[商品 ID]=[商品].[ID]);
  • IN    IN は WHERE 句で使用して、メイン クエリの現在の行の値が、サブクエリから返された値セットの一部であることを調べます。IN の前に NOT を指定して、メイン クエリの現在の行の値が、サブクエリから返された値セットの一部でないことを調べることもできます。

    たとえば、次のクエリは、部署が第一営業ではない社員によって処理された受注とその受注日の一覧を返します。

    SELECT [受注 ID], [注文日]
    FROM [受注]
    WHERE [社員 ID] IN
    (SELECT [ID] FROM [社員]
    WHERE [部署]<>'第一営業');

    NOT IN を使用する場合は、同じクエリを次のように記述できます。

    SELECT [受注 ID], [受注日]
    FROM [受注]
    WHERE [社員 ID] NOT IN
    (SELECT [ID] FROM [社員]
    WHERE [部署]='第一営業');

ページの先頭へ

スキルを磨く
トレーニングの探索
新機能を最初に入手
Office Insider に参加する

この情報は役に立ちましたか?

ご意見をいただきありがとうございます。

フィードバックをお寄せいただき、ありがとうございます。Office サポートの担当者におつなぎいたします。

×