ユニオン クエリを使用して複数の選択クエリの結果を結合する

複数の類似した選択クエリによって返されるすべてのデータを、1 つの結合されたセットとして確認する場合、ユニオン クエリを使用できます。

ここでは、既存の 2 つ以上の選択クエリからユニオン クエリを作成する方法、および構造化照会言語 (SQL) を使用してユニオン クエリを作成する方法について説明します。

ここで説明されている例を実行するには、選択クエリの作成および実行の基本を理解している必要があります。選択クエリの作成の詳細については、[参照] セクションのリンク先を参照してください。

この記事の内容


ユニオン クエリの基本

ユニオン クエリの機能

ユニオン クエリは、複数の類似した選択クエリの結果セットを結合します。

たとえば、顧客に関する情報を格納するテーブルと、仕入先に関する情報を格納するテーブルがあり、2 つのテーブルの間にはリレーションシップがないとします。両方のテーブルに、連絡先情報を格納するフィールドがあり、両方のテーブルからすべての連絡先情報を同時に参照する必要があるとします。

テーブルごとに選択クエリ (選択クエリ: テーブルに格納されているデータに関する問い合わせを行い、データを変更せずに、データシートの形式で結果セットを返すクエリです。)を作成すると、連絡先情報を含むフィールドだけを取得できますが、返される情報は 2 か所に分かれたままです。2 つ以上の選択クエリの結果を 1 つの結果セットに結合するには、ユニオン クエリを使用します。

ユニオン クエリの要件

1 つのユニオン クエリ内で結合される選択クエリの出力フィールドは、同じ数、同じ順序、同じまたは互換性のあるデータ型である必要があります。ユニオン クエリを実行すると、クエリ出力のフィールドの数が各 select ステートメントと同じになるように、対応するフィールドの各セットのデータが 1 つの出力フィールドに結合されます。

 メモ   ユニオン クエリでは、数値型とテキスト型は互換性があります。

ユニオン クエリは SQL 固有のクエリです。SQL 固有のクエリはデザイン ビューに表示できないため、SQL で直接作成する必要があります。Microsoft Office Access 2007 では、[SQL ビュー] オブジェクト タブを使用して、ユニオン クエリなどの SQL 固有のクエリを作成します。

 ヒント   すべてのクエリは、SQL ステートメントを使用して表すことができます。ほとんどのクエリは、クエリ デザイン グリッド (デザイン グリッド: クエリのデザイン ビューでクエリを設計するときや、[フィルター/並べ替えの編集] コマンドを使ってフィルター ウィンドウでフィルターを作成するときに使用する画面。前のバージョンではこれを QBE グリッドと呼んでいました。) (利用可能な場合、クエリをより簡単に作成できる環境) に表示することもできます。デザイン グリッドを使用してクエリを作成する場合、いつでも SQL ビューに切り替えて、クエリの実行時に処理される SQL ステートメントを表示できます。SQL を理解し、クエリの動作についての理解を深めるために、SQL ビューでクエリを参照することをお勧めします。期待どおりの結果を返さないクエリをトラブルシューティングする際に、SQL ビューが役立つ場合もあります。

ユニオン クエリの SQL 構文

ユニオン クエリでは、各選択クエリ (select ステートメントとも呼ばれます) に SELECT 句と FROM 句が含まれ、場合によっては WHERE 句も含まれます。SELECT 句には、取得するデータを含むフィールドが指定されます。FROM 句には、そのフィールドを含むテーブルが指定されます。WHERE 句には、そのフィールドの抽出条件が指定されます。UNION キーワードを使用して、select ステートメントをユニオン クエリ内で結合します。

2 つの選択クエリを結合するユニオン クエリの基本的な SQL 構文は、次のとおりです。

SELECT field_1[, field_2,…]
FROM table_1[, table_2,…]
UNION [ALL]
SELECT field_a[, field_b,...]
FROM table_a[, table_b,…];

たとえば、Products という名前のテーブルと Services という名前のテーブルがあるとします。どちらのテーブルにも、製品またはサービスの名前、価格、保証または保証契約の利用可否、および製品またはサービスを排他的に提供するかどうかを含むフィールドがあります。Products テーブルには保証情報が格納され、Services テーブルには保証契約情報が格納されますが、基本情報は同じです (特定の製品やサービスに品質の保証が適用されるかどうか)。次のようなユニオン クエリを使用すると、2 つのテーブルから 4 つのフィールドを結合できます。

SELECT name, price, warranty_available, exclusive_offer
FROM Products
UNION ALL
SELECT name, price, guarantee_available, exclusive_offer
FROM Services;

前の構文例を 1 行ずつ見てみましょう。

  • SELECT name, price, warranty_available, exclusive_offer    これは SELECT 句で、選択クエリを開始するために使用します。SELECT の後には、データの取得元のフィールドを示す識別子のリストが続きます。SELECT 句には、必ず 1 つ以上のフィールドを指定する必要があります。この SELECT 句には、"name"、"price"、"warranty_available"、および "exclusive_offer" の各フィールド識別子が指定されています。
  • FROM Products    これは FROM 句です。FROM 句は SELECT 句に続く句で、この 2 つの句が基本的な select ステートメントを形成します。FROM の後には、SELECT 句に指定されているフィールドを含むテーブルの識別子のリストが続きます。FROM 句には、必ず 1 つ以上のテーブルを指定する必要があります。この FROM 句には、テーブル識別子 "Products" が指定されています。
  • UNION ALL    これは UNION キーワードとオプションの ALL キーワードです。UNION は、UNION の前の SELECT ステートメントの結果が、UNION の後に続く SELECT ステートメントの結果と結合されることを示します。

ALL キーワードを使用すると、結合によって作成された結果セットから重複する行は削除されません。これにより、Access では重複する行をチェックする必要がないため、クエリのパフォーマンスが大幅に向上します。次の条件のいずれかに該当する場合、ALL キーワードを使用する必要があります。

  • 選択クエリによって、重複する行が作成されないことがわかっている。
  • 結果に重複する行が含まれていてもかまわない。
  • 重複する行を表示したい。

この例では、重複する行が返されることを想定しておらず、また重複行が存在した場合に、それらの行を表示しても問題がないため、ALL キーワードを使用します。

  • SELECT name, price, guarantee_available, exclusive_offer     これは 2 番目の SELECT 句であり、これにより、ユニオン クエリでの 2 番目の SELECT ステートメントが開始されます。ユニオン クエリを作成する場合、SELECT ステートメント内の各フィールドが対応している必要があります。つまり各 SELECT ステートメントのフィールド数が同じであり、共通のデータを共有するフィールドが同じ順序で句に指定され、共通のデータを共有するフィールドが、同じまたは互換性のあるデータ型を持つ必要があります (上の例を参照)。フィールドは、クエリ出力内で結合できるように対応している必要があります。

 メモ   ユニオン クエリの出力におけるフィールド名は、最初の SELECT 句から抽出されます。この例では、フィールド "warranty_available" およびフィールド "guarantee_available" からのデータは、クエリ出力では "warranty_available" という名前になります。

  • FROM Services    これは 2 番目の FROM 句であり、これにより、ユニオン クエリでの 2 番目の SELECT ステートメントが終了します。SELECT 句内のフィールドとは異なり、ユニオン クエリの FROM 句にはテーブルの制限はありません。各 FROM 句で同じテーブルを使用するユニオン クエリを作成できます。FROM 句のテーブルの数が異なっていてもかまいません。前の例では、各 FROM 句に含まれるテーブルは 1 つだけです。

ページの先頭へ ページの先頭へ

ユニオン クエリを作成する

ユニオン クエリを作成する 2 つの基本的な方法は、次のとおりです。

通常は、選択クエリを作成してから、作成したクエリをユニオン クエリ内で結合します。Office Access 2007 のデザイン ビューには、選択クエリを作成するための使いやすいグラフィカル ユーザー インターフェイスが用意されているため、これらのクエリの SQL ステートメントをコピーして、ユニオン クエリに貼り付けることができます。

ただし、SQL ステートメントの作成に慣れている場合、または SQL の作成に精通したい場合は、SQL ビューで直接ユニオン クエリを作成することをお勧めします。

目的に合ったトピックをクリックしてください


デザイン ビューで選択クエリを作成してから結合する

この方法では、デザイン ビューを使用して各選択クエリを作成した後、SQL ビューを使用して選択クエリを結合します。

デザイン ビューで各選択クエリを作成する

  1. [作成] タブの [その他] で [クエリ デザイン] をクリックします。
  1. [テーブルの表示] ダイアログ ボックスで、追加するフィールドを含むテーブルをダブルクリックします。

クエリ デザイン ウィンドウにテーブルが追加されます。

 メモ   選択クエリには複数のテーブルまたはクエリを含めることができますが、この手順では、各選択クエリに含めるのは 1 つのテーブルのデータだけにします。

  1. [テーブルの表示] ダイアログ ボックスを閉じます。
  2. クエリ デザイン ウィンドウで、追加する各フィールドをダブルクリックします。

フィールドを選択するときに、他の選択クエリに追加するフィールドと同じ数のフィールドを、同じ順序で追加してください。フィールドのデータ型に注意して、結合する他のクエリの同じ位置にあるフィールドのデータ型と互換性があるようにします。

たとえば、最初の選択クエリに 5 つのフィールドがあり、最初のフィールドに日付/時刻のデータが含まれている場合、結合する他の選択クエリにもそれぞれ 5 つのフィールドがあり、最初のフィールドには日付/時刻のデータが含まれるようにします。

  1. 必要に応じて、フィールド グリッドの [抽出条件] 行に適切な (式: 算術演算子または論理的演算子、定数、リテラル値、関数、フィールド名、コントロール、およびプロパティの組み合わせ。これにより、1 つの値を評価します。式は、計算、文字列の処理、データのテストなどに使用できます。)を入力することで、フィールドに抽出条件を追加します。
  2. フィールドとフィールド抽出条件を追加した後、選択クエリを実行し、出力を確認する必要があります。
    • [デザイン] タブの [結果] で [実行] をクリックします。
  1. クエリをデザイン ビューに切り替えます。
  2. 選択クエリを保存し、開いたままにしておきます。
  3. 結合する選択クエリごとに、この手順を繰り返します。

SQL ビューで選択クエリを結合する

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

新しいクエリをデザイン ビューで開きます。

  1. [テーブルの表示] ダイアログ ボックスを閉じます。
  2. [デザイン] タブの [クエリの種類] で [ユニオン] をクリックします。

クエリ デザイン ウィンドウが非表示になり、SQL ビュー オブジェクト タブが表示されます。この時点では、SQL ビュー オブジェクト タブは空です。

  1. ユニオン クエリ内で結合する最初の選択クエリのタブをクリックします。
  2. [ホーム] タブの [表示] で [表示] をクリックし、[SQL ビュー] をクリックします。

選択クエリの SQL ステートメントが表示されます。

  1. 選択クエリの SQL ステートメントをコピーします。
  2. この手順の手順 1. で作成を開始したユニオン クエリのタブをクリックします。
  3. 選択クエリの SQL ステートメントを、ユニオン クエリの SQL ビュー オブジェクト タブに貼り付けます。
  4. 選択クエリの SQL ステートメントの末尾にあるセミコロン (;) を削除します。
  5. Enter キーを押してカーソルを 1 行下へ移動し、新しい行に「UNION」と入力します。

必要に応じて、スペースを 1 つ入力した後に、ALL キーワードを入力して、再び Enter キーを押します。

  1. ユニオン クエリ内で結合する次の選択クエリのタブをクリックします。
  2. 選択クエリのすべての SQL ステートメントをコピーし、ユニオン クエリの SQL ビュー ウィンドウに貼り付けるまで、この手順の手順 5. ~ 11. を繰り返します。セミコロンは削除せず、最後の選択クエリの SQL ステートメントの後には何も入力しないでください。
  3. [デザイン] タブの [結果] で [実行] をクリックします。

ユニオン クエリの結果がデータシート ビュー (データシート ビュー: テーブル、フォーム、クエリ、ビュー、またはストアド プロシージャのデータを行/列形式で表示するビュー。データシート ビューでは、フィールドの編集、データの追加と削除、およびデータの検索を行うことができます。)に表示されます。

SQL ビューで直接ユニオン クエリを作成する

次の手順では、SQL ビューで基本的なユニオン クエリを作成する方法について説明します。

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

新しいクエリをデザイン ビューで開きます。

  1. [テーブルの表示] ダイアログ ボックスを閉じます。
  2. [デザイン] タブの [クエリの種類] で [ユニオン] をクリックします。

クエリ デザイン ウィンドウが非表示になり、SQL ビュー オブジェクト タブが表示されます。この時点では、SQL ビュー オブジェクト タブは空です。

  1. [SQL ビュー] オブジェクト タブで、「SELECT」と入力した後、クエリに含める最初のテーブルまたはテーブルのセットを基にフィールドのリストを入力します。フィールド名を区切るには、コンマを使用します。フィールド名のリストを入力した後、Enter キーを押します。
  2. 「FROM」と入力した後、前の SELECT 句に指定したフィールドを含むテーブルの名前を入力し、Enter キーを押します。
  3. これらのテーブルの 1 つからフィールドの抽出条件を指定するには、「WHERE」、フィールド名、比較演算子 (通常は等号 "=")、抽出条件を順に入力します。AND および OR キーワードを使用して、WHERE 句の末尾に別の抽出条件を追加することもできます。抽出条件を指定した場合は、Enter キーを押します。
  4. 「UNION」と入力します。クエリの出力から重複する行を削除しない場合は、スペースを 1 つ入力した後、ALL キーワードを入力し、Enter キーを押します。
  5. 「SELECT」と入力した後、クエリに含める次のテーブルまたはテーブルのセットを基にフィールドのリストを入力します。これらのフィールドは、最初の SELECT 句に含まれるフィールドに対応し、同じ順序である必要があります。フィールド名を区切るには、コンマを使用します。フィールド名を入力した後、Enter キーを押します。
  6. 「FROM」と入力した後、クエリに含めるテーブルまたはテーブルのセットの名前を入力し、Enter キーを押します。
  7. これらのテーブルの 1 つからフィールドの抽出条件を指定するには、「WHERE」、フィールド名、比較演算子 (通常は等号 "=")、抽出条件を順に入力します。AND キーワードを使用して、WHERE 句の末尾に別の抽出条件を追加することもできます。抽出条件を指定した場合は、Enter キーを押します。
  8. ユニオン クエリに別の select ステートメントを追加するには、手順 7. ~ 10. を繰り返します。
  9. クエリの末尾を示すには、「;」を入力します。
  10. [デザイン] タブの [結果] で [実行] をクリックします。

ユニオン クエリの結果がデータシート ビュー (データシート ビュー: テーブル、フォーム、クエリ、ビュー、またはストアド プロシージャのデータを行/列形式で表示するビュー。データシート ビューでは、フィールドの編集、データの追加と削除、およびデータの検索を行うことができます。)に表示されます。

ページの先頭へ ページの先頭へ

ユニオン クエリの使用のヒント

  • 各行がどのテーブルのものかを区別できるようにするには、各 select ステートメントにフィールドとしてテキスト文字列を追加します。たとえば、Products という名前のテーブルからフィールドを取得する select ステートメントと、Services という名前のテーブルからフィールドを取得する select ステートメントがある場合、最初のステートメントの末尾にフィールドとして文字列 "Product" を追加し、2 番目のステートメントの末尾に "Service" を追加します。次の例に示すように、AS キーワードを使用して、文字列にフィールド エイリアス ("type" など) を割り当てることもできます。
SELECT field1, field2, ... "Product" AS type
SELECT field1, field2, ... "Service" AS type

クエリ出力には、その行が Products テーブルのものか Services テーブルのものかを示す、"type" という名前のフィールドが含まれます。

  • 各 UNION キーワードは、直前および直後の SELECT ステートメントを結合します。クエリ内で UNION キーワードと共に ALL キーワードを使用し、他のキーワードは使用しない場合、結果には、UNION ALL を使用して結合された SELECT ステートメントのペアによって、重複する行が含まれますが、ALL キーワードのない UNION を使用して結合された SELECT ステートメントでは、重複する行は含まれません。
  • ユニオン クエリで結合される選択クエリ内のフィールドの数、データ型、および順序は対応している必要がありますが、計算やサブクエリなどの式を使用して、対応付けることができます。たとえば、"Right" 関数を使用して 2 文字の年フィールドを 4 文字の年フィールドに対応付けることで、4 文字の年の末尾 2 桁を抽出できます。
  • ユニオン クエリの出力を使用して新しいテーブルを作成する場合、新しい選択クエリの入力としてユニオン クエリを使用し、その選択クエリをテーブル作成クエリ (テーブル作成クエリ: テーブルを新規作成し、既存のテーブルまたはクエリ結果からレコードをコピーして、テーブルにレコード (行) を作成するクエリ (SQL ステートメント)。)の基礎として使用できます。
      1. ユニオン クエリを作成して保存します。
      2. [作成] タブの [その他] で [クエリ デザイン] をクリックします。
  1. [テーブルの表示] ダイアログ ボックスで、[クエリ] タブをクリックします。
  2. ユニオン クエリをダブルクリックした後、[テーブルの表示] ダイアログ ボックスを閉じます。

 メモ   メッセージ バーにセキュリティ警告が表示された場合、テーブル作成クエリなどのアクション クエリが無効になることがあります。アクション クエリを実行できるようにするには、メッセージ バーの [オプション] をクリックし、[Microsoft Office セキュリティ オプション] ダイアログ ボックスの [このコンテンツを有効にする] をクリックします。

  1. 新しいテーブルを作成するためにユニオン クエリのフィールドをすべて使用する場合は、クエリ デザイン グリッドのユニオン クエリのオブジェクト タブで、アスタリスク (*) をダブルクリックします。

または

新しいテーブルで使用する各フィールドをダブルクリックします。

  1. [デザイン] タブの [クエリの種類] で [テーブルの作成] をクリックします。
  1. [テーブルの作成] ダイアログ ボックスに新しいテーブルの名前を入力し、必要に応じて、テーブルを作成する別のデータベースを指定した後、[OK] をクリックします。
  2. [デザイン] タブの [結果] で [実行] をクリックします。

ユニオン クエリを使用して完全外部結合を実行するには、次の手順を実行します。

  1. 完全外部結合に使用するフィールドに対して左外部結合を含むクエリを作成します。
  2. [ホーム] タブの [表示] で [表示] をクリックし、[SQL ビュー] をクリックします。
  3. Ctrl キーを押しながら C キーを押して、SQL コードをコピーします。
  4. FROM 句の末尾にあるセミコロンを削除し、Enter キーを押します。
  5. 「UNION」と入力し、Enter キーを押します。

 メモ   ユニオン クエリを使用して完全外部結合を実行する場合は、ALL キーワードを使用しないでください。

  1. Ctrl キーを押しながら V キーを押して、手順 3. でコピーした SQL コードを貼り付けます。
  2. 貼り付けたコードで、"LEFT JOIN" を "RIGHT JOIN" に変更します。
  3. 2 番目の FROM 句の末尾にあるセミコロンを削除し、Enter キーを押します。
  4. FROM 句に指定されている最初のテーブル (左側のテーブル) で、結合フィールドの値が NULL であることを指定する WHERE 句を追加します。

たとえば、次の FROM 句を使用するとします。

FROM Products RIGHT JOIN [Order Details] 
 ON Products.ID = [Order Details].[Product ID]

この場合、次の WHERE 句を追加します。

WHERE Products.ID IS NULL
  1. ユニオン クエリの末尾であることを示すには、WHERE 句の末尾にセミコロン (;) を入力します。
  2. [デザイン] タブの [結果] で [実行] をクリックします。

ページの先頭へ ページの先頭へ

 
 
適用対象:
Access 2007