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

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

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

この記事の内容

<link xlink:href="a8532322-e42f-4f94-bc38-ace7c182916a#bm1">クエリの結果を別のクエリのフィールドとして使用する</link>

<link xlink:href="a8532322-e42f-4f94-bc38-ace7c182916a#bm2">サブクエリをクエリ フィールドの抽出条件として使用する</link>

<link xlink:href="a8532322-e42f-4f94-bc38-ace7c182916a#bm3">サブクエリで使用できる共通の SQL キーワード</link>

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

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

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

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

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

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

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

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

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

  5. [<ui>作成</ui>] タブの [<ui>クエリ</ui>] グループで [<ui>クエリ デザイン</ui>] をクリックします。

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

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

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

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

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

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

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

    Prior Date: (SELECT MAX([Order Date]) 
    FROM [Product Orders] AS [Old Orders]
    WHERE [Old Orders].[Order Date] < [Product Orders].[Order Date]
    AND [Old Orders].[Product ID] = [Product Orders].[Product ID])

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

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

    <codeInline>Interval: [Order Date]-[Prior Date]</codeInline>

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

  14. [<ui>デザイン</ui>] タブの [<ui>結果</ui>] グループで、[<ui>実行</ui>] をクリックします。

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

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

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

<link xlink:href="a8532322-e42f-4f94-bc38-ace7c182916a#__top">ページの先頭へ</link>

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

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

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

  1. Northwind.accdb を開いて、そのコンテンツを有効にします。

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

  3. [<ui>作成</ui>] タブの [<ui>その他</ui>] グループで [<ui>クエリ デザイン</ui>] をクリックします。

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

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

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

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

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

    IN (SELECT [ID] FROM [Employees] 
    WHERE [Job Title]<>'Sales Representative')

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

  9. [<ui>デザイン</ui>] タブの [<ui>結果</ui>] グループで、[<ui>実行</ui>] をクリックします。

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

<link xlink:href="a8532322-e42f-4f94-bc38-ace7c182916a#__top">ページの先頭へ</link>

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

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

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

  • <embeddedLabel>ALL</embeddedLabel> 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]);
  • <embeddedLabel>ANY</embeddedLabel> 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 の同義語です。

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

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

    SELECT *
    FROM [Products]
    WHERE EXISTS
    (SELECT * FROM [Order Details]
    WHERE [Order Details].[Product ID]=[Products].[ID]);

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

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

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

    SELECT [Order ID], [Order Date]
    FROM [Orders]
    WHERE [Employee ID] IN
    (SELECT [ID] FROM [Employees]
    WHERE [Job Title]<>'Sales Representative');

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

    SELECT [Order ID], [Order Date]
    FROM [Orders]
    WHERE [Employee ID] NOT IN
    (SELECT [ID] FROM [Employees]
    WHERE [Job Title]='Sales Representative');

<link xlink:href="a8532322-e42f-4f94-bc38-ace7c182916a#__top">ページの先頭へ</link>

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

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

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

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

×