1 つのセットのレコード (2 つ以上のテーブルのすべてのレコードが含まれる一覧) を作成するために、1 つのテーブルまたはクエリのレコードを、他の 1 つ以上のテーブルのレコードと共に一覧表示することが必要な場合があります。 これが Access のユニオン クエリの目的です。
ユニオン クエリを効果的に理解するには、まず Access の基本的な選択クエリの設計に慣れる必要があります。 選択クエリの設計の詳細については、「簡単な選択クエリを作成する」を参照してください。
動作しているユニオン クエリの例を調査する
これまでに共用体クエリを作成したことがない場合は、最初に Northwind Access テンプレートの作業例を調べるのに役立つ場合があります。 [ ファイル ] > [ 新規作成 ] をクリックすると、Access の [作業の開始] ページで Northwind サンプル テンプレートを検索できます。または、この場所から直接コピーをダウンロードできます。 Northwind サンプル テンプレート。
Access で Northwind データベースが開いたら、最初に表示されるログイン ダイアログ フォームを閉じ、ナビゲーション ウィンドウを展開します。 ナビゲーション ウィンドウの上部をクリックし、[オブジェクトの種類] を選択してすべてのデータベース オブジェクトを種類別に整理します。 次に、[クエリ] グループを展開すると、[Product Transactions] というクエリが表示されます。
ユニオン クエリは、他のクエリ オブジェクトと簡単に区別されます。これは、ユニオン クエリには、2 つのセットが結合されていることを表す 2 つの組み合わされた円のような特別なアイコンが付いているためです。
通常の選択クエリとアクション クエリとは異なり、テーブルは共用体クエリには関連しません。つまり、Access グラフィック クエリ デザイナーを使用して共用体クエリを作成または編集することはできません。 これは、ナビゲーション ウィンドウから共用体クエリを開くと発生します。Access によって開き、データシート ビューに結果が表示されます。 [ホーム] タブの [ビュー] コマンドで、共用体クエリを操作するときにデザイン ビューを使用できないことがわかります。 データシート ビュー と SQL ビュー は、共用体クエリを使用する場合にのみ切り替えることができます。
このユニオン クエリの例の調査を続行するには、[ホーム]、[表示]、[SQL ビュー] の順にクリックしてユニオン クエリを定義している SQL ステートメントを表示します。 次の図では、ユニオン クエリを構成するさまざまな部分を簡単に確認できるように、SQL にいくらかの余分なスペースを追加しました。
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 つのユニオン クエリに結合することができます。
この手順を読まずに、例を見る場合は、次のセクションの「ユニオン クエリを作成する例を見る」を参照してください。
-
[作成] タブの [クエリ] グループで [クエリ デザイン] をクリックします。
-
含めるフィールドがあるテーブルをダブルクリックします。 クエリ デザイン ウィンドウにテーブルが追加されます。
-
クエリ デザイン ウィンドウで、追加する各フィールドをダブルクリックします。 フィールドを選ぶときに、他の選択クエリに追加するフィールドと同じ数のフィールドを、同じ順序で追加してください。 フィールドのデータ型に注意して、結合する他のクエリの同じ位置にあるフィールドのデータ型と互換性があるようにします。 たとえば、最初の選択クエリに 5 つのフィールドがあり、最初のフィールドに日付/時刻のデータが含まれている場合、結合する他の選択クエリにもそれぞれ 5 つのフィールドがあり、最初のフィールドには日付/時刻のデータが含まれるようにします。
-
必要に応じて、フィールド グリッドの [抽出条件] 行に適切な式を入力することで、フィールドに抽出条件を追加します。
-
フィールドとフィールドの抽出条件の追加が終わったら、選択クエリを実行して出力を確認する必要があります。 [デザイン] タブの [結果] グループで、[実行] をクリックします。
-
クエリをデザイン ビューに切り替えます。
-
選択クエリを保存し、開いたままにしておきます。
-
結合する選択クエリごとに、この手順を繰り返します。
選択したクエリを作成したら、それらを組み合わせます。 この手順では、SQL ステートメントをコピーして貼り付けることで、共用体クエリを作成します。
-
[作成] タブの [クエリ] グループで [クエリ デザイン] をクリックします。
-
[デザイン] タブの [クエリ] グループで、[ユニオン] をクリックします。 クエリのデザイン ウィンドウが非表示になり、SQL ビューのオブジェクト タブが表示されます。 この時点では、SQL ビュー オブジェクト タブは空です。
-
ユニオン クエリ内で結合する最初の選択クエリのタブをクリックします。
-
[ホーム] タブで [表示]、[SQL ビュー] の順にクリックします。
-
選択クエリの SQL ステートメントをコピーします。 前に作成を開始したユニオン クエリのタブをクリックします。
-
選択クエリの SQL ステートメントを、ユニオン クエリの SQL ビュー オブジェクト タブに貼り付けます。
-
選択クエリの SQL ステートメントの末尾にあるセミコロン (;) を削除します。
-
Enter キーを押してカーソルを 1 行下へ移動し、新しい行に「UNION」と入力します。
-
ユニオン クエリ内で結合する次の選択クエリのタブをクリックします。
-
手順 5 から 10 を繰り返し、選択クエリのすべての SQL ステートメントをユニオン クエリの SQL ビュー ウィンドウにコピーして貼り付けます。 最後の選択クエリの SQL ステートメントで、末尾のセミコロンを削除したり、末尾に文字などを入力したりしないでください。
-
[デザイン] タブの [結果] グループで、[実行] をクリックします。
ユニオン クエリの結果がデータシート ビューに表示されます。
ユニオン クエリを作成する例を見る
Northwind サンプル データベースで再作成できる例を示します。 このユニオン クエリは Customers テーブルからユーザーの名前を収集し、Suppliers テーブルのユーザーの名前と結合します。 この話題に興味がある場合は、Northwind サンプル データベースのコピーで次の手順を実行します。
このサンプルを作成するのに必要な手順は次のとおりです。
-
Customers テーブルと Suppliers テーブルをそれぞれデータ ソースとして使用し、Query1 および Query2 という 2 つの選択クエリを作成します。 表示値として姓と名のフィールドを使用します。
-
最初はデータ ソースを指定せずに Query3 という新しいクエリを作成し、[デザイン] タブの [ユニオン] コマンドをクリックしてこのクエリをユニオン クエリにします。
-
Query1 と Query2 から SQL ステートメントをコピーして Query3 に貼り付けます。 余分なセミコロンを削除し、UNION キーワードを追加します。 その後、データシート ビューで結果を確認できます。
-
クエリの 1 つに並べ替え句を追加してから、ユニオン クエリの SQL ビューに ORDER BY ステートメントを貼り付けます。 並べ替えを追加する場合は、ユニオン クエリの Query3 で、最初にセミコロンを削除し、次にフィールド名からテーブル名を削除するようにしてください。
-
このユニオン クエリの例の場合、名前を結合して並べ替える最終的な 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 キーワード (keyword)を追加することで、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;
データシート ビューに切り替えると、Access によって Buy 値が取得されますが、値がテキストに変換されていることがわかります。 データシート ビューで左揃えになっているため、これらはテキスト値であることを示すことができます。 最初のクエリの空の文字列は数値ではないため、これらの結果が表示されます。 また、購入レコードに空の文字列が含まれているため、Sell 値もテキストに変換されます。
商品 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 サンプル データベースで作成できる別の例を示します。
-
新しい簡単なクエリを作成して、ビール (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];
-
データシート ビューに切り替えると、4 つの購入が表示されます。
受領日
数量
1/22/2006
100
1/22/2006
60
4/4/2006
50
4/5/2006
300
-
合計を取得するには、次の SQL を使用して、簡単な集計クエリを作成します。
SELECT Max([Date Received]), Sum([Quantity]) AS SumOfQuantity FROM [Purchase Order Details] WHERE ((([Purchase Order Details].[Product ID])=34))
-
データシート ビューに切り替えると、1 つのレコードのみが表示されます。
最新受領日
数量合計
4/5/2006
510
-
次の 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];
-
データシート ビューに切り替えると、それぞれの合計を含む 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 サンプル データベースで作成できる別の例を次に示します。
-
次の SQL ステートメントを使用して、簡単な選択クエリを作成します。
SELECT Employees.City, Employees.City AS Filter FROM Employees;
-
データシート ビューに切り替えると、次の結果が表示されます。
都市
フィルター
Seattle
Seattle
Bellevue
Bellevue
Redmond
Redmond
Kirkland
Kirkland
Seattle
Seattle
Redmond
Redmond
Seattle
Seattle
Redmond
Redmond
Seattle
Seattle
-
これらの結果を見ても、あまり値が表示されない可能性があります。 クエリ全体を展開し、次の SQL を使用してユニオン クエリに変換します。
SELECT Employees.City, Employees.City AS Filter FROM Employees UNION SELECT "<All>", "*" AS Filter FROM Employees ORDER BY City;
-
データシート ビューに切り替えると、次の結果が表示されます。
都市
フィルター
<All>
*
Bellevue
Bellevue
Kirkland
Kirkland
Redmond
Redmond
Seattle
Seattle
既に示した 9 つのレコードが結合され、<All> と "*" の固定フィールド値が付けられています。
この union 句には UNION ALL が含まれていないため、異なるレコードのみが返されます。つまり、各都市が 1 回のみ返され、同じ固定値が付けられます。
-
各都市名を 1 回のみ表示するユニオン クエリと共にすべての都市を効果的に選択するオプションが完成したので、このクエリをフォームのコンボ ボックスのレコード ソースとして使用できます。 この具体的な例をモデルとして使用すると、フォームのコンボ ボックス コントロールを作成し、このクエリをそのレコード ソースとして設定し、Filter 列の Column Width プロパティを 0 (ゼロ) に設定して非表示にしてから、Bound Column プロパティを 1 に設定して 2 番目の列のインデックスを指定することができます。 次に、フォーム独自の Filter プロパティで、次のようなコードを追加して、コンボ ボックス コントロールで選択した項目の値を使用するフォーム フィルターを使用可能にすることができます。
Me.Filter = "[City] Like '" & Me![FilterComboBoxName].Value & "'" Me.FilterOn = True
これで、フォームのユーザーはフォーム レコードを特定の都市名でフィルター処理したり、<All> を選択してすべての都市に関してすべてのレコードを一覧表示したりすることができます。