ユニオン クエリを使って複数のクエリを 1 つの結果に結合する

ユニオン クエリを使って複数のクエリを 1 つの結果に結合する

1 つのセットのレコード (2 つ以上のテーブルのすべてのレコードが含まれる一覧) を作成するために、1 つのテーブルまたはクエリのレコードを、他の 1 つ以上のテーブルのレコードと共に一覧表示することが必要な場合があります。これが Access のユニオン クエリの目的です。

ユニオン クエリを効果的に理解するには、まず Access の基本的な選択クエリの設計に慣れる必要があります。選択クエリの設計の詳細については、「簡単な選択クエリを作成する」を参照してください。

注:  この記事の内容が該当するのは、ユニオン クエリを Access デスクトップ データベースで使う場合だけです。ユニオン クエリを Access Web データベースまたは Access Web アプリで作成、使用することはできません。

動作しているユニオン クエリの例を調査する

これまでにユニオン クエリを作成したことがない場合は、最初に Northwind Access テンプレートの動作している例を調査すると役に立つことがあります。Access の [作業の開始] ページで、Northwind サンプル テンプレートを検索することができます。これには、[ファイル]、[新規] の順にクリックするか、次の場所からコピーを直接ダウンロードします。Northwind サンプル テンプレート

Access で Northwind データベースが開いたら、最初に表示されるログイン ダイアログ フォームを閉じ、ナビゲーション ウィンドウを展開します。ナビゲーション ウィンドウの上部をクリックし、[オブジェクトの種類] を選択してすべてのデータベース オブジェクトを種類別に整理します。次に、[クエリ] グループを展開すると、[Product Transactions] というクエリが表示されます。

ユニオン クエリは、他のクエリ オブジェクトと簡単に区別されます。これは、ユニオン クエリには、2 つのセットが結合されていることを表す 2 つの組み合わされた円のような特別なアイコンが付いているためです。

Access のユニオン クエリ アイコンのスクリーンショット。

標準の選択クエリやアクション クエリとは異なり、ユニオン クエリのテーブルは関連付けられていません。つまり、Access のグラフィック クエリ デザイナーを使用してユニオン クエリを構築することも編集することもできません。ナビゲーション ウィンドウからユニオン クエリを開くと、これがわかります。Access によってユニオン クエリが開かれ、その結果はデータシート ビューに表示されます。ユニオン クエリを使用する場合、[ホーム] タブの [表示] コマンドでは、[デザイン ビュー] が利用できないことがわかります。ユニオン クエリを使用している場合は、[データシート ビュー] と [SQL ビュー] を切り替えることしかできません。

このユニオン クエリの例の調査を続行するには、[ホーム]、[表示]、[SQL ビュー] の順にクリックしてユニオン クエリを定義している SQL ステートメントを表示します。次の図では、ユニオン クエリを構成するさまざまな部分を簡単に確認できるように、SQL にいくらかの余分なスペースを追加しました。

お使いのブラウザーではビデオがサポートされていません。Microsoft Silverlight、Adobe Flash Player、Internet Explorer 9 のいずれかをインストールしてください。

Northwind データベースのこのユニオン クエリの SQL ステートメントを詳細に調査してみましょう。

SELECT [Product ID], [Order Date], [Company Name], [Transaction], [Quantity]
FROM [Product Orders]

UNION

SELECT [Product ID], [Creation Date], [Company Name], [Transaction], [Quantity]
FROM [Product Purchases]

ORDER BY [Order Date] DESC;

この SQL ステートメントの最初の部分と 3 番目の部分は、必要不可欠な 2 つの選択クエリです。これらのクエリは、Product Orders テーブルと Product Purchases テーブルから 2 つの異なるレコード セットを取得します。

この SQL ステートメントの 2 番目の部分は、UNION キーワードです。これは、このクエリが 2 つのレコード セットを結合するように Access に指示します。

この SQL ステートメントの最後の部分は、ORDER BY ステートメントを使用して、結合されたレコードの順序を決定します。この例では、Access は [Order Date] フィールドに基づいてすべてのレコードを降順に並べます。

注: Access のユニオン クエリは、常に読み取り専用なので、データシート ビューの値を変更することはできません。

選択クエリを作成して結合することで、ユニオン クエリを作成する

SQL ビューに SQL ステートメントを直接記述してユニオン クエリを作成できる場合でも、選択クエリを使ってユニオン クエリを分けて作成する方が簡単なこともあります。その後、SQL の各部分をコピーして貼り付けて、1 つのユニオン クエリに結合することができます。

この手順を読まずに、例を見る場合は、次のセクションの「ユニオン クエリを作成する例を見る」を参照してください。

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

  2. [テーブルの表示] ダイアログ ボックスで、追加するフィールドを含むテーブルをダブルクリックします。クエリ デザイン ウィンドウにテーブルが追加されます。

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

  4. クエリ デザイン ウィンドウで、追加する各フィールドをダブルクリックします。フィールドを選ぶときに、他の選択クエリに追加するフィールドと同じ数のフィールドを、同じ順序で追加してください。フィールドのデータ型に注意して、結合する他のクエリの同じ位置にあるフィールドのデータ型と互換性があるようにします。たとえば、最初の選択クエリに 5 つのフィールドがあり、最初のフィールドに日付/時刻のデータが含まれている場合、結合する他の選択クエリにもそれぞれ 5 つのフィールドがあり、最初のフィールドには日付/時刻のデータが含まれるようにします。

  5. 必要に応じて、フィールド グリッドの [抽出条件] 行に適切な式を入力することで、フィールドに抽出条件を追加します。

  6. フィールドとフィールドの抽出条件の追加が終わったら、選択クエリを実行して出力を確認する必要があります。[デザイン] タブの [結果] グループで、[実行] をクリックします。

  7. クエリをデザイン ビューに切り替えます。

  8. 選択クエリを保存し、開いたままにしておきます。

  9. 結合する選択クエリごとに、この手順を繰り返します。

これで、選択クエリを作成できました。次に、選択クエリを結合します。この手順では、SQL ステートメントをコピーして貼り付けることで、ユニオン クエリを作成します。

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

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

  3. [デザイン] タブの [クエリ] グループで、[ユニオン] をクリックします。クエリのデザイン ウィンドウが非表示になり、SQL ビューのオブジェクト タブが表示されます。この時点では、SQL ビュー オブジェクト タブは空です。

  4. ユニオン クエリ内で結合する最初の選択クエリのタブをクリックします。

  5. [ホーム] タブで [表示]、[SQL ビュー] の順にクリックします。

  6. 選択クエリの SQL ステートメントをコピーします。前に作成を開始したユニオン クエリのタブをクリックします。

  7. 選択クエリの SQL ステートメントを、ユニオン クエリの SQL ビュー オブジェクト タブに貼り付けます。

  8. 選択クエリの SQL ステートメントの末尾にあるセミコロン (;) を削除します。

  9. Enter キーを押してカーソルを 1 行下へ移動し、新しい行に「UNION」と入力します。

  10. ユニオン クエリ内で結合する次の選択クエリのタブをクリックします。

  11. 手順 5 から 10 を繰り返し、選択クエリのすべての SQL ステートメントをユニオン クエリの SQL ビュー ウィンドウにコピーして貼り付けます。最後の選択クエリの SQL ステートメントで、末尾のセミコロンを削除したり、末尾に文字などを入力したりしないでください。

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

ユニオン クエリの結果がデータシート ビューに表示されます。

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

Northwind サンプル データベースで再作成できる例を示します。このユニオン クエリは Customers テーブルからユーザーの名前を収集し、Suppliers テーブルのユーザーの名前と結合します。この話題に興味がある場合は、Northwind サンプル データベースのコピーで次の手順を実行します。

お使いのブラウザーではビデオがサポートされていません。Microsoft Silverlight、Adobe Flash Player、Internet Explorer 9 のいずれかをインストールしてください。

このサンプルを作成するのに必要な手順は次のとおりです。

  1. Customers テーブルと Suppliers テーブルをそれぞれデータ ソースとして使用し、Query1 および Query2 という 2 つの選択クエリを作成します。表示値として姓と名のフィールドを使用します。

  2. 最初はデータ ソースを指定せずに Query3 という新しいクエリを作成し、[デザイン] タブの [ユニオン] コマンドをクリックしてこのクエリをユニオン クエリにします。

  3. Query1 と Query2 から SQL ステートメントをコピーして Query3 に貼り付けます。余分なセミコロンを削除し、UNION キーワードを追加します。その後、データシート ビューで結果を確認できます。

  4. クエリの 1 つに並べ替え句を追加してから、ユニオン クエリの SQL ビューに ORDER BY ステートメントを貼り付けます。並べ替えを追加する場合は、ユニオン クエリの Query3 で、最初にセミコロンを削除し、次にフィールド名からテーブル名を削除するようにしてください。

  5. このユニオン クエリの例の場合、名前を結合して並べ替える最終的な SQL は、次のとおりです。

    SELECT Customers.Company, Customers.[Last Name], Customers.[First Name]
    FROM Customers
    
    UNION
    
    SELECT Suppliers.Company, Suppliers.[Last Name], Suppliers.[First Name]
    FROM Suppliers
    
    ORDER BY [Last Name], [First Name];

SQL ステートメントを記述する高度な技術をお持ちの場合は、直接 SQL ビューに独自の SQL ステートメントを書き込むことができます。ただし、他のクエリ オブジェクトから SQL をコピーして貼り付ける方法を実行すると便利な場合があります。各クエリは、ここで使用した単純な選択クエリの例よりもはるかに複雑なことがあります。各クエリをユニオン クエリに結合する前に、慎重に作成してテストすることをお勧めします。ユニオン クエリの実行に失敗した場合は、成功するまで各クエリを個別に調整してから、修正したステートメントを使用してユニオン クエリを再構築することができます。

ユニオン クエリの使用に関するその他のヒントとテクニックについては、この記事の残りのセクションを確認してください。

Northwind データベースを使用する前のセクションの例では、2 つのテーブルのデータのみを結合しました。ところが、3 つ以上のテーブルを結合して簡単にユニオン クエリを作成することもできます。たとえば、前の例に基づいて、クエリ出力に employees の名前を含める場合もあります。このタスクを実行するには、次のように、3 番目のクエリを追加し、UNION キーワードをもう 1 つ使用して前の SQL ステートメントと結合します。

SELECT Customers.Company, Customers.[Last Name], Customers.[First Name]
FROM Customers

UNION

SELECT Suppliers.Company, Suppliers.[Last Name], Suppliers.[First Name]
FROM Suppliers

UNION

SELECT Employees.Company, Employees.[Last Name], Employees.[First Name]
FROM Employees

ORDER BY [Last Name], [First Name];

データシート ビューに結果を表示すると、サンプル会社名を含むすべての従業員が一覧表示されますが、これはあまり役に立たない可能性があります。そのフィールドで社内の従業員か仕入先の人か顧客かを示す場合は、会社名の代わりに固定値を含めることができます。この SQL は次のようになります。

SELECT "Customer" As Employment, Customers.[Last Name], Customers.[First Name]
FROM Customers

UNION

SELECT "Supplier" As Employment, Suppliers.[Last Name], Suppliers.[First Name]
FROM Suppliers

UNION

SELECT "In-house" As Employment, Employees.[Last Name], Employees.[First Name]
FROM Employees

ORDER BY [Last Name], [First Name];

データシート ビューに表示される結果を次に示します。次の 5 つのレコード例が表示されます。

Employment

In-house

Freehafer

Nancy

In-house

Giussani

Laura

Supplier

Glasson

Stuart

Customer

Goldschmidt

Daniel

Customer

Gratacos Solsona

Antonio

ユニオン クエリの最初のクエリから出力フィールドの名前を読み取るだけなので、上記のクエリは、さらに短縮できます。2 番目と 3 番目のクエリ セクションから出力を削除したものを次に示します。

SELECT "Customer" As Employment, [Last Name], [First Name]
FROM Customers

UNION

SELECT "Supplier", [Last Name], [First Name]
FROM Suppliers

UNION

SELECT "In-house", [Last Name], [First Name]
FROM Employees

ORDER BY [Last Name], [First Name];

Access のユニオン クエリでは、並べ替えは 1 回しか許可されませんが、フィルター処理は各クエリで個別に行うことができます。前のセクションのユニオン クエリを基にして、WHERE 句を追加して各クエリをフィルター処理した例を次に示します。

SELECT "Customer" As Employment, Customers.[Last Name], Customers.[First Name]
FROM Customers
WHERE [State/Province] = "UT"

UNION

SELECT "Supplier", [Last Name], [First Name]
FROM Suppliers
WHERE [Job Title] = "Sales Manager"

UNION

SELECT "In-house", Employees.[Last Name], Employees.[First Name]
FROM Employees
WHERE City = "Seattle"

ORDER BY [Last Name], [First Name];

データシート ビューに切り替えると、次のような結果が表示されます。

Employment

Supplier

Andersen

Elizabeth A.

In-house

Freehafer

Nancy

Customer

Hasselberg

Jonas

In-house

Hellung Larsen

Anne

Supplier

Hernandez-Echevarria

Amaya

Customer

Mortensen

Sven

Supplier

Sandberg

Mikael

Supplier

青木

啓太

In-house

Thorpe

Steven

Supplier

Weiler

Cornelia

In-house

Zare

Robert

結合するクエリが大きく異なると、出力フィールドで異なるデータ型のデータを結合することが必要な場合があります。その場合、ユニオン クエリは、結果をテキスト データ型で返すことがよくあります。これは、そのデータ型がテキスト数字の両方を保持することができるためです。

このしくみを理解するために、Northwind サンプル データベースの Product Transactions ユニオン クエリを使用します。そのサンプル データベースを開き、Product Transactions クエリをデータシート ビューで開きます。最後の 10 個のレコードは、次の出力のようになります。

商品 ID

受注日

会社名

トランザクション

数量

77

1/22/2006

Supplier B

Purchase

60

80

1/22/2006

Supplier D

Purchase

75

81

1/22/2006

Supplier A

Purchase

125

81

1/22/2006

Supplier A

Purchase

200

7

1/20/2006

Company D

Sale

10

51

1/20/2006

Company D

Sale

10

80

1/20/2006

Company D

Sale

10

34

1/15/2006

Company AA

Sale

100

80

1/15/2006

Company AA

Sale

30

[数量] フィールドを [購入] と [販売] の 2 つに分割するとします。また、値のないフィールドに固定値 0 を表示するとします。このユニオン クエリを表す SQL を次に示します。

SELECT [Product ID], [Order Date], [Company Name], [Transaction], 0 As Buy, [Quantity] As Sell
FROM [Product Orders]

UNION

SELECT [Product ID], [Creation Date], [Company Name], [Transaction], [Quantity] As Buy, 0 As Sell
FROM [Product Purchases]

ORDER BY [Order Date] DESC; 

データシート ビューに切り替えると、最後の 10 個のレコードは次のように表示されます。

商品 ID

受注日

会社名

トランザクション

購入

販売

74

1/22/2006

Supplier B

Purchase

20

0

77

1/22/2006

Supplier B

Purchase

60

0

80

1/22/2006

Supplier D

Purchase

75

0

81

1/22/2006

Supplier A

Purchase

125

0

81

1/22/2006

Supplier A

Purchase

200

0

7

1/20/2006

Company D

Sale

0

10

51

1/20/2006

Company D

Sale

0

10

80

1/20/2006

Company D

Sale

0

10

34

1/15/2006

Company AA

Sale

0

100

80

1/15/2006

Company AA

Sale

0

30

この例を続行する場合、0 のフィールドを空にするにはどうしますか?次のように、Null キーワードを追加して、0 の代わりに何も表示しないように SQL を変更することができます。

SELECT [Product ID], [Order Date], [Company Name], [Transaction], Null As Buy, [Quantity] As Sell
FROM [Product Orders]

UNION

SELECT [Product ID], [Creation Date], [Company Name], [Transaction], [Quantity] As Buy, Null As Sell
FROM [Product Purchases]

ORDER BY [Order Date] DESC;

ただし、データシート ビューに切り替えるとわかるように、予期しない結果が表示されます。[購入] 列のすべてのフィールドがクリアされています。

商品 ID

受注日

会社名

トランザクション

購入

販売

74

1/22/2006

Supplier B

Purchase

 

 

77

1/22/2006

Supplier B

Purchase

 

 

80

1/22/2006

Supplier D

Purchase

 

 

81

1/22/2006

Supplier A

Purchase

 

 

81

1/22/2006

Supplier A

Purchase

 

 

7

1/20/2006

Company D

Sale

 

10

51

1/20/2006

Company D

Sale

 

10

80

1/20/2006

Company D

Sale

 

10

34

1/15/2006

Company AA

Sale

 

100

80

1/15/2006

Company AA

Sale

 

30

この現象が発生するのは、Access が最初のクエリからフィールドのデータ型を決定するためです。この例では、Null は数字ではありません。

それでは、フィールドの空白値に空の文字列を挿入しようとするときはどうしますか?これを試みる SQL は、次のようになります。

SELECT [Product ID], [Order Date], [Company Name], [Transaction], "" As Buy, [Quantity] As Sell
FROM [Product Orders]

UNION

SELECT [Product ID], [Creation Date], [Company Name], [Transaction], [Quantity] As Buy, "" As Sell
FROM [Product Purchases]

ORDER BY [Order Date] DESC;

データシート ビューに切り替えると、[購入] 値が取得されますが、値がテキストに変換されました。データシート ビューでこれらの値が左揃えされているため、テキスト値であることがわかります。最初のクエリの空の文字列は数字ではありません。このため、このような結果になりました。また、購入レコードに空の文字列が含まれているため、[販売] 値もテキストに変換されていることがわかります。

商品 ID

受注日

会社名

トランザクション

購入

販売

74

1/22/2006

Supplier B

Purchase

20

 

77

1/22/2006

Supplier B

Purchase

60

 

80

1/22/2006

Supplier D

Purchase

75

 

81

1/22/2006

Supplier A

Purchase

125

 

81

1/22/2006

Supplier A

Purchase

200

 

7

1/20/2006

Company D

Sale

 

10

51

1/20/2006

Company D

Sale

 

10

80

1/20/2006

Company D

Sale

 

10

34

1/15/2006

Company AA

Sale

 

100

80

1/15/2006

Company AA

Sale

 

30

では、これはどのように解決するのでしょうか?

解決するには、クエリでフィールド値が数字になるように強制します。これには、次の式を使用します。

IIf(False, 0, Null)

False を確認するこの条件は True になることはないので、式は常に Null を返しますが、Access は引き続き両方の出力オプションを評価し、出力が数値であるか、または Null であるかを決定します。

動作している例でこの式を使用する方法を以下に示します。

SELECT [Product ID], [Order Date], [Company Name], [Transaction], IIf(False, 0, Null) As Buy, [Quantity] As Sell
FROM [Product Orders]

UNION

SELECT [Product ID], [Creation Date], [Company Name], [Transaction], [Quantity] As Buy, Null As Sell
FROM [Product Purchases]

ORDER BY [Order Date] DESC;

2 番目のクエリを変更する必要はないことに注意してください。

データシート ビューに切り替えると、必要な結果が表示されます。

商品 ID

受注日

会社名

トランザクション

購入

販売

74

1/22/2006

Supplier B

Purchase

20

 

77

1/22/2006

Supplier B

Purchase

60

 

80

1/22/2006

Supplier D

Purchase

75

 

81

1/22/2006

Supplier A

Purchase

125

 

81

1/22/2006

Supplier A

Purchase

200

 

7

1/20/2006

Company D

Sale

 

10

51

1/20/2006

Company D

Sale

 

10

80

1/20/2006

Company D

Sale

 

10

34

1/15/2006

Company AA

Sale

 

100

80

1/15/2006

Company AA

Sale

 

30

別の方法で同じ結果を得るには、ユニオン クエリ内のクエリの先頭にさらに別のクエリを追加します。

SELECT 
    0 As [Product ID], Date() As [Order Date], 
    "" As [Company Name], "" As [Transaction], 
    0 As Buy, 0 As Sell
FROM [Product Orders]
WHERE False

フィールドごとに、定義したデータ型の固定値が返されます。もちろん、このクエリの出力は結果に影響してはいけないので、False に設定した WHERE 句を含めるテクニックを使用すると、これを回避できます。

WHERE False

このちょっとしたテクニックは、常に false なので、クエリは何も返しません。このステートメントを既存の SQL と結合すると、次のように、完成したステートメントになります。

SELECT 
    0 As [Product ID], Date() As [Order Date], 
    "" As [Company Name], "" As [Transaction], 
    0 As Buy, 0 As Sell
FROM [Product Orders]
WHERE False

UNION

SELECT [Product ID], [Order Date], [Company Name], [Transaction], Null As Buy, [Quantity] As Sell
FROM [Product Orders]

UNION

SELECT [Product ID], [Creation Date], [Company Name], [Transaction], [Quantity] As Buy, Null As Sell
FROM [Product Purchases]

ORDER BY [Order Date] DESC;

注: Northwind データベースを使用するこの例で結合したクエリは 100 レコードを返しますが、2 つの個別のクエリはそれぞれ 58 レコードと 43 レコードを返し、合計で 101 レコードを返します。この不一致の理由は、2 つのレコードが一意でないことです。UNION ALL を使用してこのシナリオを解決する方法については、「UNION ALL を使用してユニオン クエリで異なるレコードを操作する」セクションを参照してください。

ユニオン クエリの特殊な例として、1 つのセットのレコードを 1 つ以上のフィールドの合計が含まれている 1 つのレコードと結合することがあります。

ユニオン クエリで合計を取得する方法を説明するために、Northwind サンプル データベースで作成できる別の例を示します。

  1. 新しい簡単なクエリを作成して、ビール (Northwind データベースでは Product ID = 34) の購入を表示します。ここでは、次の SQL ステートメントを使用します。

    SELECT [Purchase Order Details].[Date Received], [Purchase Order Details].Quantity
    FROM [Purchase Order Details]
    WHERE ((([Purchase Order Details].[Product ID])=34))
    
    ORDER BY [Purchase Order Details].[Date Received];
  2. データシート ビューに切り替えると、4 つの購入が表示されます。

    受領日

    数量

    1/22/2006

    100

    1/22/2006

    60

    4/4/2006

    50

    4/5/2006

    300

  3. 合計を取得するには、次の SQL を使用して、簡単な集計クエリを作成します。

    SELECT Max([Date Received]), Sum([Quantity]) AS SumOfQuantity
    FROM [Purchase Order Details]
    WHERE ((([Purchase Order Details].[Product ID])=34))
  4. データシート ビューに切り替えると、1 つのレコードのみが表示されます。

    最新受領日

    数量合計

    4/5/2006

    510

  5. 次の 2 つのクエリをユニオン クエリに結合して、合計数量を含むレコードを購入レコードに追加します。

    SELECT [Purchase Order Details].[Date Received], [Purchase Order Details].Quantity
    FROM [Purchase Order Details]
    WHERE ((([Purchase Order Details].[Product ID])=34))
    
    UNION
    
    SELECT Max([Date Received]), Sum([Quantity]) AS SumOfQuantity
    FROM [Purchase Order Details]
    WHERE ((([Purchase Order Details].[Product ID])=34))
    
    ORDER BY [Purchase Order Details].[Date Received];
  6. データシート ビューに切り替えると、それぞれの合計を含む 4 つの購入とその後に数量を合計したレコードが表示されます。

    受領日

    数量

    1/22/2006

    60

    1/22/2006

    100

    4/4/2006

    50

    4/5/2006

    300

    4/5/2006

    510

これには、ユニオン クエリに合計を追加する基本が含まれます。両方のクエリに “Detail” や “Total” などの固定値を含めて、合計レコードを他のレコードと視覚的に区別する場合もあります。固定値の使用については、「3 つ以上のテーブルまたはクエリを結合してユニオン クエリにする」セクションで確認できます。

既定では、Access のユニオン クエリには、異なるレコードのみが含まれます。ただし、すべてのレコードを含める場合はどうしますか?別の例がここで役立つ可能性があります。

前のセクションでは、ユニオン クエリで合計を作成する方法を示しました。そのユニオン クエリ SQL を変更して、Product ID = 48 を含めます。

SELECT [Purchase Order Details].[Date Received], [Purchase Order Details].Quantity
FROM [Purchase Order Details]
WHERE ((([Purchase Order Details].[Product ID])=48))

UNION

SELECT Max([Date Received]), Sum([Quantity]) AS SumOfQuantity
FROM [Purchase Order Details]
WHERE ((([Purchase Order Details].[Product ID])=48))

ORDER BY [Purchase Order Details].[Date Received];

データシート ビューに切り替えると、少し誤解を招く結果が表示されます。

受領日

数量

1/22/2006

100

1/22/2006

200

もちろん、1 つのレコードが合計で 2 回数量を返すことはありません。

この結果が表示される理由は、Purchase Order Details テーブルに記録されているように、1 日に同じ数量のチョコレートが 2 回販売されたためです。Northwind サンプル データベースの両方のレコードを示す簡単な選択クエリの結果を次に示します。

発注書 ID

Product

Quantity

100

Northwind Traders Chocolate

100

92

Northwind Traders Chocolate

100

上記のユニオン クエリでは、Purchase Order ID フィールドが含まれていないことと、2 つのフィールドでは 2 つの異なるレコードが作成されないことがわかります。

すべてのレコードを含める場合は、SQL で UNION の代わりに UNION ALL を使用します。これは結果の並べ替えに影響を与える可能性が高いため、ORDER BY 句を追加して並べ替え順序を指定することもできます。前の例とは別に作成した変更後の SQL を次に示します。

SELECT [Purchase Order Details].[Date Received], Null As [Total], [Purchase Order Details].Quantity
FROM [Purchase Order Details]
WHERE ((([Purchase Order Details].[Product ID])=48))

UNION ALL

SELECT Max([Date Received]), "Total" As [Total], Sum([Quantity]) AS SumOfQuantity
FROM [Purchase Order Details]
WHERE ((([Purchase Order Details].[Product ID])=48))

ORDER BY [Total];

データシート ビューに切り替えると、すべての詳細と最後のレコードとして合計が表示されます。

受領日

合計

数量

1/22/2006

 

100

1/22/2006

 

100

1/22/2006

Total

200

ユニオン クエリの一般的な使用方法は、フォームのコンボ ボックス コントロールのレコード ソースとして機能することです。コンボ ボックスを使用すると、値を選択してフォームのレコードをフィルター処理することができます。たとえば、都市別に従業員レコードをフィルター処理することができます。

このしくみを確認するために、Northwind サンプル データベースで作成できる別の例を次に示します。

  1. 次の SQL ステートメントを使用して、簡単な選択クエリを作成します。

    SELECT Employees.City, Employees.City AS Filter
    FROM Employees;
  2. データシート ビューに切り替えると、次の結果が表示されます。

    都市

    フィルター

    Seattle

    Seattle

    Bellevue

    Bellevue

    Redmond

    Redmond

    Kirkland

    Kirkland

    Seattle

    Seattle

    Redmond

    Redmond

    Seattle

    Seattle

    Redmond

    Redmond

    Seattle

    Seattle

  3. これらの結果を見ても、あまり値が表示されない可能性があります。クエリ全体を展開し、次の SQL を使用してユニオン クエリに変換します。

    SELECT Employees.City, Employees.City AS Filter
    FROM Employees
    
    UNION
    
    SELECT "<All>", "*" AS Filter
    FROM Employees
    
    ORDER BY City;
  4. データシート ビューに切り替えると、次の結果が表示されます。

    都市

    フィルター

    <All>

    *

    Bellevue

    Bellevue

    Kirkland

    Kirkland

    Redmond

    Redmond

    Seattle

    Seattle

    既に示した 9 つのレコードが結合され、<All> と "*" の固定フィールド値が付けられています。

    この union 句には UNION ALL が含まれていないため、異なるレコードのみが返されます。つまり、各都市が 1 回のみ返され、同じ固定値が付けられます。

  5. 各都市名を 1 回のみ表示するユニオン クエリと共にすべての都市を効果的に選択するオプションが完成したので、このクエリをフォームのコンボ ボックスのレコード ソースとして使用できます。この具体的な例をモデルとして使用すると、フォームのコンボ ボックス コントロールを作成し、このクエリをそのレコード ソースとして設定し、Filter 列の Column Width プロパティを 0 (ゼロ) に設定して非表示にしてから、Bound Column プロパティを 1 に設定して 2 番目の列のインデックスを指定することができます。次に、フォーム独自の Filter プロパティで、次のようなコードを追加して、コンボ ボックス コントロールで選択した項目の値を使用するフォーム フィルターを使用可能にすることができます。

    Me.Filter = "[City] Like '" & Me![FilterComboBoxName].Value & "'"
    Me.FilterOn = True

    これで、フォームのユーザーはフォーム レコードを特定の都市名でフィルター処理したり、<All> を選択してすべての都市に関してすべてのレコードを一覧表示したりすることができます。

ページの先頭へ

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

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

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

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

×