場合によっては、1 つのテーブルまたはクエリのレコードを、1 つ以上の他のテーブルのレコードと組み合わせて 1 つの結果にしたい場合があります。 これは Access におけるユニオン クエリの動作です。
ユニオン クエリを効果的に理解するには、まず Access の基本的な選択クエリの設計に慣れる必要があります。 選択クエリの設計の詳細については、「簡単な選択クエリを作成する」を参照してください。
動作しているユニオン クエリの例を調査する
これまでにユニオン クエリを作成したことがない場合は、最初に Northwind Access テンプレートで実際の例を調べると役立つ場合があります。 Northwind サンプル テンプレートは、Access の [作業の開始] ページで [ ファイル>新規] を選択して検索できます。 Northwind サンプル テンプレートからコピーを直接ダウンロードすることもできます。
Access で Northwind データベースが開いたら、最初に表示されるログイン ダイアログ ボックスを閉じ、ナビゲーション ウィンドウを展開します。 ナビゲーション ウィンドウの上部を選択し、[ オブジェクトの種類] を選択して、すべてのデータベース オブジェクトを種類別に整理します。 次に、[ クエリ] グループを展開すると、「 Product Transactions」という名前のクエリが表示されます。
ユニオン クエリは、他のクエリ オブジェクトと簡単に区別されます。これは、ユニオン クエリには、2 つのセットが結合されていることを表す 2 つの組み合わされた円のような特別なアイコンが付いているためです。
通常の選択クエリとアクション クエリとは異なり、ユニオン クエリではテーブルが関連付けられていません。 つまり、Access のグラフィック クエリ デザイナーを使用してユニオン クエリを作成または編集することはできません。 ナビゲーション ウィンドウからユニオン クエリを開くと、Access ではそれが開かれ、データシート ビューに結果が表示されます。 [ホーム] タブの [ビュー] で、ユニオン クエリを使用する場合にはデザイン ビューを使用できないことに注意してください。
データシート ビューと SQL ビューの間でのみ切り替えることができます。
このユニオン クエリの例の学習を続けるには、[Home]>Views>SQL View をクリックし、このクエリを定義する 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 番目の部分は、これら 2 つのレコード セットを結合するように Access に指示するUNION キーワード (keyword)です。
この SQL ステートメントの最後の部分では、 ORDER BY ステートメントを使用して結合レコードの順序を決定します。 この例では、すべてのレコードが [受注日] フィールドによって降順で並べ替えられます。
注
Access のユニオン クエリは、常に読み取り専用なので、データシート ビューの値を変更することはできません。
選択クエリを作成して結合することで、ユニオン クエリを作成する
ユニオン クエリは、 SQL 構文を SQL ビューで直接記述することで作成できますが、選択したクエリでパーツに分けて作成する方が簡単な場合があります。 その後、SQL の各部分をコピーして貼り付けて、1 つのユニオン クエリに結合することができます。
この手順を読まずに、例を見る場合は、次のセクションの「ユニオン クエリを作成する例を見る」を参照してください。
- [作成] タブの [クエリ] グループで [クエリ デザイン] をクリックします。
- 追加するフィールドがあるテーブルをダブルクリックします。 クエリ デザイン ウィンドウにテーブルが追加されます。
- クエリ デザイン ウィンドウで、追加する各フィールドをダブルクリックします。 フィールドを選ぶときに、他の選択クエリに追加するフィールドと同じ数のフィールドを、同じ順序で追加してください。 フィールドのデータ型に注意して、結合する他のクエリの同じ位置にあるフィールドのデータ型と互換性があるようにします。 たとえば、最初の選択クエリに 5 つのフィールドがあり、最初のフィールドに日付/時刻のデータが含まれている場合、結合する他の選択クエリにもそれぞれ 5 つのフィールドがあり、最初のフィールドには日付/時刻のデータが含まれるようにします。
- 必要に応じて、フィールド グリッドの [抽出条件] 行に適切な式を入力することで、フィールドに抽出条件を追加します。
- フィールドとフィールドの抽出条件の追加が終わったら、選択クエリを実行して出力を確認する必要があります。 [デザイン] タブの [結果] グループで、[実行] をクリックします。
- クエリをデザイン ビューに切り替えます。
- 選択クエリを保存し、開いたままにしておきます。
- 結合する選択クエリごとに、この手順を繰り返します。
選択したクエリを作成したので、それらを結合します。 この手順では、 SQL ステートメントをコピーして貼り付けて、ユニオン クエリを作成します。
- [作成] タブの [クエリ] グループで [クエリ デザイン] をクリックします。
- [デザイン] タブの [クエリ] グループで、[ユニオン] をクリックします。 クエリ デザイン ウィンドウが非表示になり、[ SQL ビュー オブジェクト] タブが表示されます。この時点で、タブは空になっています。
- ユニオン クエリ内で結合する最初の選択クエリのタブをクリックします。
- [ ホーム] タブで、[ 表示>SQL ビュー] をクリックします。
- select クエリの
SQLステートメントをコピーします。 前に作成を開始したユニオン クエリのタブをクリックします。 - select クエリの
SQLステートメントをユニオン クエリの [SQL ビュー オブジェクト] タブに貼り付けます。 - select クエリ
SQLステートメントの末尾にあるセミコロン (;) を削除します。 - Enter キーを押してカーソルを 1 行下に移動し、新しい行に「
UNION」と入力します。 - ユニオン クエリ内で結合する次の選択クエリのタブをクリックします。
- 選択クエリの
SQLステートメントをすべてコピーし、ユニオン クエリの SQL ビュー ウィンドウに貼り付けるまで、手順 5 から 10 を繰り返します。 最後の選択クエリのSQLステートメントの後にセミコロンを削除したり、何も入力しないでください。 - [デザイン] タブの [結果] グループで、[実行] をクリックします。
ユニオン クエリの結果がデータシート ビューに表示されます。
ユニオン クエリを作成する例を見る
Northwind サンプル データベースで再作成できる例を次に示します。 このユニオン クエリは Customers テーブルからユーザーの名前を収集し、Suppliers テーブルのユーザーの名前と結合します。 この話題に興味がある場合は、Northwind サンプル データベースのコピーで次の手順を実行します。
このサンプルを作成するのに必要な手順は次のとおりです。
Customers テーブルと Suppliers テーブルをそれぞれデータ ソースとして使用し、Query1 および Query2 という 2 つの選択クエリを作成します。 表示値として姓と名のフィールドを使用します。
最初はデータ ソースを指定せずに Query3 という新しいクエリを作成し、[デザイン] タブの [ユニオン] コマンドをクリックしてこのクエリをユニオン クエリにします。
Query1 と Query2 から SQL ステートメントをコピーして Query3 に貼り付けます。 余分なセミコロンを削除し、
UNIONキーワード (keyword)を追加してください。 その後、データシート ビューで結果を確認できます。クエリの 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 をコピーして貼り付ける方法を実行すると便利な場合があります。 各クエリは、ここで使用した単純な選択クエリの例よりもはるかに複雑なことがあります。 各クエリをユニオン クエリに結合する前に、慎重に作成してテストすることをお勧めします。 ユニオン クエリの実行に失敗した場合は、成功するまで各クエリを個別に調整してから、修正したステートメントを使用してユニオン クエリを再構築することができます。
ユニオン クエリの使用に関するその他のヒントとテクニックについては、この記事の残りのセクションを確認してください。
3 つ以上のテーブルまたはクエリを結合してユニオン クエリにする
前のセクションで 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 つのフィールド (買いと売り) に分割するとします。 また、フィールドに値のない固定ゼロ値が必要であると仮定します。 このユニオン クエリの 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)を追加することで、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;
データシート ビューに切り替えると、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 |
では、これはどのように解決するのでしょうか?
解決策の 1 つは、フィールド値が数値になるようにクエリで強制的に処理することです。 次の式でそれを行うことができます。
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 つのレコードとレコードのセットを結合することです。
ユニオン クエリで合計を取得する方法を説明するために、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 つ以上のテーブルまたはクエリを結合してユニオン クエリにする」セクションで確認できます。
UNION ALL を使用してユニオン クエリで異なるレコードを操作する
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 倍を返すわけではありません。
この結果が表示されるのは、[発注書の詳細] テーブルに記録されているとおり、1 日に同じ量のチョコレートが 2 回販売されたためです。 Northwind サンプル データベースの両方のレコードを示す簡単な選択クエリの結果を次に示します。
| 発注書 ID | 製品 | Quantity |
|---|---|---|
| 100 | Northwind Traders Chocolate | 100 |
| 92 | Northwind Traders Chocolate | 100 |
前述のユニオン クエリでは、[発注書 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;データシート ビューに切り替えると、次の結果が表示されます。
都市 フィルター <すべて> * Bellevue Bellevue Kirkland Kirkland Redmond Redmond Seattle Seattle Access では、前に示した 9 つのレコードの和集合が、 <All> と "*" の固定フィールド値を使用して実行されます。 この union 句には
UNION ALLが含まれていないため、Access は個別のレコードのみを返します。 つまり、各都市は、固定された同一値で 1 回だけ返されます。各都市名を 1 回のみ表示するユニオン クエリと共にすべての都市を効果的に選択するオプションが完成したので、このクエリをフォームのコンボ ボックスのレコード ソースとして使用できます。 この具体的な例をモデルとして使用すると、フォームのコンボ ボックス コントロールを作成し、このクエリをそのレコード ソースとして設定し、Filter 列の Column Width プロパティを 0 (ゼロ) に設定して非表示にしてから、Bound Column プロパティを 1 に設定して 2 番目の列のインデックスを指定することができます。 フォーム自体の
Filterプロパティで、次のようなコードを追加して、コンボ ボックス コントロールで選択した値を使用してフォーム フィルターをアクティブにすることができます。Me.Filter = "[City] Like '" & Me![FilterComboBoxName].Value & "'" Me.FilterOn = Trueフォームのユーザーは、フォーム レコードを特定の市区町村名にフィルター処理するか、[ <All> を選択してすべての都市のすべてのレコードを一覧表示できます。