Access でクエリを作成して使用するときに、場合によってはテーブルからフィールドを選択し、いくつかの抽出基準を適用して結果を表示するだけで簡単に終わることがあります。 ところが、多くの場合、必要なデータは複数のテーブルに分散しています。 そのような場合は、複数のソースの情報を組み合わせるクエリを作成できます。 このトピックでは、複数のテーブルからデータを取得する方法について、いくつかのシナリオを使用して説明します。
目的に合ったトピックをクリックしてください
関連テーブルのデータを使用して情報の価値を高める
必要な情報が 1 つのテーブルに基づくクエリで得られる場合もありますが、別のテーブルからデータを取得すると、より明確で役に立つクエリの結果を得ることができます。 たとえば、クエリの結果として得られる従業員 ID の一覧があるとします。 この結果に従業員の名前を表示するとさらに便利ですが、従業員の名前は別のテーブルにあります。 クエリの結果に従業員名を表示するには、両方のテーブルをクエリに含める必要があります。
クエリ ウィザードを使用してプライマリ テーブルと関連テーブルからクエリを作成する
-
リレーションシップ ウィンドウで、リレーションシップにリレーションシップが定義されているかどうかを確認します。
方法
-
[データベース ツール] タブの [表示/非表示] グループで [リレーションシップ] をクリックします。
-
[デザイン] タブの [リレーションシップ] で [すべてのリレーションシップ] をクリックします。
-
リレーションシップが定義されているテーブルを特定します。
-
[リレーションシップ] ウィンドウにテーブルが表示される場合、リレーションシップが既に定義されていることを確認します。
リレーションシップは、2 つのテーブルの共通のフィールドを結ぶ線によって示されます。 この線をダブルクリックすると、テーブル内のどのフィールドがリレーションシップによって結び付いているかを確認できます。
-
[リレーションシップ] ウィンドウにテーブルが表示されない場合、テーブルを追加する必要があります。
[デザイン] タブの [表示/非表示] グループの [テーブル名] をクリックします。
表示するテーブルのそれぞれをダブルクリックし、[閉じる] をクリックします。
-
-
2 つのテーブル間のリレーションシップが見つからない場合は、一方のテーブルのフィールドをもう一方のテーブルのフィールドにドラッグしてリレーションシップを作成します。 リレーションシップを作成する両方のフィールドのデータ型が同じである必要があります。
注: オートナンバー データ型のフィールドと数値データ型のフィールドの間には、そのフィールドのサイズが長整数の場合は、リレーションシップを作成することができます。 一対多リレーションシップの作成時には、このようなことがよくあります。
[リレーションシップ] ダイアログ ボックスが表示されます。
-
[作成] をクリックしてリレーションシップを作成します。
リレーションシップを作成するときのオプションの詳細については、「リレーションシップを作成、編集、または削除する」を参照してください。
-
リレーションシップ ウィンドウを閉じます。
-
-
[作成] タブの [クエリ] グループで [クエリ ウィザード] をクリックします。
-
[新しいクエリ] ダイアログ ボックスの [選択クエリ ウィザード] をクリックし、[OK] をクリックします。
-
[テーブル/クエリ] ボックスの一覧で、クエリに含める基本情報が入っているテーブルをクリックします。
-
[ 使用可能なフィールド] ボックスの一覧で、クエリに含める最初のフィールドをクリックし、単一の右矢印ボタンをクリックして、そのフィールドを [選択したフィールド] リストに移動します。 クエリに含めるテーブルの追加フィールドごとに同じ操作を行います。 これらは、クエリ出力で返されるフィールド、または条件を適用して出力内の行を制限するために使用するフィールドです。
-
[テーブル/クエリ] ボックスの一覧で、クエリ結果の価値を高めるために使用する関連データが入っているテーブルをクリックします。
-
クエリ結果の価値を高めるために使用するすべてのフィールドを [選択したフィールド] ボックスの一覧に追加し、[次へ] をクリックします。
-
[クエリで集計を行うかどうかを選択してください] の下の [詳細] または [集計する] をクリックします。
クエリで集計関数 (Sum、Avg、Min、Max、Count、StDev、Var) を実行しない場合は、詳細クエリを選びます。 クエリで集計関数を実行する場合は、集計クエリを選びます。 選択が終わったら、[次へ] をクリックします。
-
[完了] をクリックして結果を表示します。
ノースウィンド サンプル データベースを使用した例
次の例では、クエリ ウィザードを使用して、受注の一覧、各受注の運送料、および各受注の担当社員を表示するクエリを作成します。
注: この例では、ノースウィンド サンプル データベースを変更します。 必要な場合は、ノースウィンド サンプル データベースのバックアップ コピーを作成し、そのバックアップ コピーを使用してこの例の操作を実行してください。
クエリ ウィザードを使用してクエリを作成する
-
ノースウィンド サンプル データベースを開きます。 ログイン フォームを閉じます。
-
[作成] タブの [クエリ] グループで [クエリ ウィザード] をクリックします。
-
[新しいクエリ] ダイアログ ボックスの [選択クエリ ウィザード] をクリックし、[OK] をクリックします。
-
[テーブル/クエリ] ボックスの一覧の [テーブル: 受注] をクリックします。
-
[選択可能なフィールド] ボックスの一覧の [受注 ID] をダブルクリックし、[選択したフィールド] リストに移動します。 [運送料] をダブルクリックし、[選択したフィールド] ボックスに移動します。
-
[テーブル/クエリ] ボックスの一覧の [テーブル: 社員] をクリックします。
-
[選択可能なフィールド] ボックスの一覧の [姓] をダブルクリックし、[選択したフィールド] リストに移動します。 [姓] をダブルクリックし、[選択したフィールド] リストに移動します。 [次へ] をクリックします。
-
すべての受注の一覧を作成しているので、クリックし、詳細クエリを使用します。 社員ごとに受注の運送料を集計するなど、集計関数を実行する場合は、集計クエリを使用します。 [各レコードのすべてのフィールドを表示する] をクリックし、[次へ] をクリックします。
-
[完了] をクリックして結果を表示します。
クエリにより、各受注の運送料とその受注を処理した社員の姓名を含む受注の一覧が返されます。
2 つのテーブルのデータを第 3 のテーブルとのリレーションシップを使用して結合する
2 つのテーブルのデータが第 3 のテーブルを介して互いに関連していることがよくあります。 そのようなケースでは、通常、最初の 2 つのテーブルのデータが多対多リレーションシップで関連しています。 多くの場合、このような 2 つのテーブル間の多対多リレーションシップは、3 つのテーブルが関与する 2 つの一対多リレーションシップに分割するのが優れたデータベース設計とされています。 この操作は、接合テーブルまたはリレーションシップ テーブルと呼ばれる第 3 のテーブルを作成して行いますが、この第 3 のテーブルには、他の 2 つのテーブルのそれぞれについて、主キーと外部キーが 1 つずつ含まれます。 その結果、接合テーブルの各外部キーと他のテーブルの一方の対応する主キーとの間に一対多リレーションシップが作成されます。 このような場合、2 つのテーブルだけからデータを取得する場合でも、3 つのテーブルをすべてクエリに含める必要があります。
多対多リレーションシップを持つテーブルを使用して選択クエリを作成する
-
[作成] タブの [クエリ] グループで [クエリ デザイン] をクリックします。
-
クエリに含めるデータと、それらをリンクするジャンクション テーブルを含む 2 つのテーブルをダブルクリックし、[ 閉じる] をクリックします。
3 つのテーブルのすべてが対応するフィールドで結合され、クエリ デザイン ワークスペースに表示されます。
-
クエリ結果で使用する各フィールドをダブルクリックします。 ダブルクリックした各フィールドがクエリ デザイン グリッドに表示されます。
-
クエリ デザイン グリッドで、[抽出条件] 行を使用して、フィールドの抽出条件を入力します。 クエリ結果にフィールドを表示しないでフィールドの抽出条件を使用するには、そのフィールドの [表示] 行のチェック ボックスをオフにします。
-
フィールド内の値に基づいて結果を並べ替えるには、クエリ デザイン グリッドで、そのフィールドの [並べ替え] 行の [昇順] または [降順] を (レコードの並べ替え順に応じて) クリックします。
-
[デザイン] タブの [結果] グループで、[実行] をクリックします。
クエリの出力がデータシート ビューに表示されます。
ノースウィンド サンプル データベースを使用した例
注: この例では、ノースウィンド サンプル データベースを変更します。 必要な場合は、ノースウィンド サンプル データベースのバックアップ コピーを作成し、そのバックアップ コピーを使用してこの例の操作を実行してください。
会社の Web サイトをリオデジャネイロの供給業者が見つけ、業務提携をもちかけてきたというシナリオを考えます。 しかし、この業者は、リオデジャネイロとサンパウロ周辺でしか事業を行っていません。 この業者は、会社が仲介するすべてのカテゴリの食品を扱っています。 この業者の規模はかなり大きく、十分に利益を挙げることが可能な年間 2 万レアル (約 9,300 ドル) 以上の潜在的売上高を保証するよう求めています。 この業者が求める市場を提供できるでしょうか。
この問いに答えるために必要なデータは、[得意先] テーブルと [受注明細] テーブルの 2 か所にあります。 これらのテーブルは、[受注] テーブルによって互いに関連付けられています。 3 つのテーブル間のリレーションシップは既に定義されています。 [受注] テーブルでは、各受注に対し、[得意先] テーブルの [得意先コード] フィールドに関連付けられた得意先を 1 つだけ割り当てることができます。 [受注明細] テーブルの各レコードには、[受注] テーブルの [受注コード] フィールドの注文が 1 つだけ割り当てられます。 つまり、1 つの得意先が複数の注文を行っていることがあり、各受注には複数の受注明細があります。
この例では、リオデジャネイロとサンパウロにおける年間総売上高を表示するクロス集計クエリを作成します。
デザイン ビューでクエリを作成する
-
ノースウィンド データベースを開きます。 ログイン フォームを閉じます。
-
[作成] タブの [クエリ] グループで [クエリ デザイン] をクリックします。
-
[顧客]、[注文]、[注文の詳細] の順にダブルクリックします。
3 つのテーブルがすべてクエリ デザイン ワークスペースに表示されます。
-
[得意先] テーブルの [市区町村] フィールドをダブルクリックして、クエリ デザイン グリッドに追加します。
-
クエリ デザイン グリッドで、[市区町村] 列の [抽出条件] 行に、「In ("Rio de Janeiro","São Paulo")」と入力します。 これで、得意先の所在地がこれらの都市のうちいずれかであるレコードだけがクエリに含められます。
-
[受注明細] テーブルの [出荷日] フィールドと [単価] フィールドをダブルクリックします。
クエリ デザイン グリッドにフィールドが追加されます。
-
クエリ デザイン グリッドの [出荷日] 列で [フィールド] 行をクリックします。 [出荷日] を発送年度: Format([出荷日],"yyyy") に置き換えます。 これで、フィールドの別名 "発送年度" が作成され、[出荷日] フィールドの値の年部分だけを使用できるようになります。
-
クエリ デザイン グリッドの [単価] 列で [フィールド] 行をクリックします。 [単価] を「売上高: [受注明細].[単価]*[数量]-[受注明細].[単価]*[数量]*[割引]」に置き換えます。 これで、フィールドの別名 "売上高" が作成され、各レコードの売上高が計算されます。
-
[デザイン] タブの [クエリの種類] で [クロス集計] をクリックします。
[合計] と [クロス集計] という 2 つの新しい行がクエリ デザイン グリッドに表示されます。
-
クエリ デザイン グリッドで、[市区町村] 列の [クロス集計] 行をクリックし、[行見出し] をクリックします。
これで、市区町村の値が行見出しとして表示されます (つまり、各市区町村について 1 行が返されます)。
-
[発送年度] 列の [クロス集計] 行をクリックし、[行見出し] をクリックします。
これで、発送年度の値が行見出しとして表示されます (つまり、各発送年度について 1 列が返されます)。
-
[売上高] 列の [クロス集計] 行をクリックし、[値] をクリックします。
これで、行と列が交差する場所に売上高の値が表示されます (つまり、市区町村と発送年度の各組み合わせについて 1 つの売上高の値が返されます)。
-
[売上高] 列の [集計] 行をクリックし、[合計] をクリックします。
これで、この列の値が合計されます。
他の 2 つの列については、集計済みの値ではなくそのままの値を表示する方がよいため、[集計] 行を既定値である [グループ化] のままにすることができます。
-
[デザイン] タブの [結果] グループで、[実行] をクリックします。
これで、リオデジャネイロとサンパウロの年間総売上高を返すクエリが作成されました。
同じような 2 つのテーブルのすべてのレコードを表示する
場合によっては、構造が同じ 2 つのテーブルのデータを結合する必要がありますが、そのうちの 1 つは別のデータベースに配置されます。 次のような状況を想定します。
アナリストとして生徒のデータを処理しています。 現在勤務している学校と別の学校でデータを共有して、それぞれのカリキュラムを改善しようという計画に着手しています。 疑問点を解明するために、それぞれの学校のレコードを個別に調べるより、両方の学校のすべてのデータを調べる方が有効な場合があります。
別の学校のデータを手元のデータベースの新しいテーブルにインポートすることもできますが、その学校で加えられる変更が手元のデータベースに反映されません。 それよりも、別の学校のテーブルにリンクし、両方の学校のデータを実行時に組み合わせるクエリを作成する方が効率的です。 2 つの分析を実行してそれを 1 つのものとして解釈するのではなく、データをまとめて分析することができます。
構造が同じ 2 つのテーブルのすべてのレコードを表示するには、ユニオン クエリを使用します。
ユニオン クエリはデザイン ビューで表示できません。 ユニオン クエリを作成するには、SQL ビュー オブジェクト タブで SQL コマンドを入力します。
2 つのテーブルを使用してユニオン クエリを作成する
-
[作成] タブの [クエリ] グループで [クエリ デザイン] をクリックします。
-
[デザイン] タブの [クエリの種類] で [ユニオン] をクリックします。
クエリがデザイン ビューから SQL ビューに切り替わります。 この時点では、SQL ビュー オブジェクト タブは空です。
-
SQL ビューで、「SELECT」と入力し、その後に最初のテーブルからクエリに含める各フィールドの名前を入力します。 フィールド名は角かっこで囲みコンマで区切って入力する必要があります。 フィールド名の入力が終わったら、Enter キーを押します。 カーソルが SQL ビューの次の行に移動します。
-
「FROM」と入力した後、クエリに含める最初のテーブルの名前を入力します。 Enter キーを押します。
-
最初のテーブルのフィールドの条件を指定する場合は、「 WHERE」と入力し、その後にフィールド名、比較演算子 (通常は等号 (=))、および条件を入力します。 AND キーワードと、最初の条件に使用されるのと同じ構文を使用して、WHERE 句の末尾に条件を追加できます。たとえば、WHERE [ClassLevel]="100" AND [CreditHours]>2 です。 条件の指定が完了したら、Enter キーを押します。
-
「UNION」と入力し、Enter キーを押します。
-
「SELECT」と入力した後、2 番目のテーブルからクエリに含める各フィールドの名前を角かっこで囲み、コンマで区切って入力します。 最初のテーブルから選択したものと同じフィールドを同じ順序で指定する必要があります。 フィールド名は角かっこで囲みコンマで区切って入力する必要があります。 フィールド名の入力が終わったら、Enter キーを押します。
-
「FROM」と入力し、クエリに含める 2 番目のテーブルの名前を入力します。 Enter キーを押します。
-
必要な場合は、手順 6. に示されているように WHERE 句を追加します。
-
クエリの終わりを示すセミコロン (;) を入力します。
-
[デザイン] タブの [結果] グループで、[実行] をクリックします。
結果はデータシート ビューに表示されます。