テーブルおよびクエリを結合する

クエリの中で複数のテーブルを使用する場合には、目的の結果を得るために、結合を使用します。クエリで結合を使用すると、クエリ内でのテーブルどうしの関係に基づいて、参照する各テーブルから目的のレコードのみを取得できます。この記事では、結合の概要、結合のさまざまな種類、および結合の使用方法について説明します。

この記事の内容


はじめに

リレーショナル データベースは、最も基本的なレベルでは、互いに論理的なリレーションシップを持つ複数のテーブルで構成されています。リレーションシップは、互いに共通するフィールドでテーブルどうしを関連付けるときに使用するものです。クエリ内でリレーションシップを表すのが結合です。

Microsoft Office Access 2007 では、クエリにテーブルを追加するときに、当該のテーブル間で定義されているリレーションシップに基づく結合が作成されます。クエリでは、結合は手動で作成することもでき、定義済みのリレーションシップを表さない結合でも作成できます。クエリのデータの取得元として、テーブルの代わりまたはテーブルとの併用で他のクエリを使用する場合、データ取得元として使用するクエリ間の結合や、データ取得元のクエリとテーブルの間の結合を作成できます。

結合は、クエリ操作の対象となるデータが満たす規則を確立するという意味では、クエリの抽出条件と同様です。ただし、結合の場合は、抽出条件とは違って、結合条件を満たす各行のペアが組み合わされて、レコードセットでは単一の行になります。

結合には、内部結合、外部結合、クロス結合、および不等結合という 4 つの基本的な種類があります。この記事では、使用できる各種類の結合、それぞれの種類の用途、および結合の作成方法について説明します。

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

内部結合

内部結合は、最も一般的な種類の結合です。結合するテーブルの一方が、もう一方のテーブルの行に一致していることを、結合するフィールドのデータに基づいて、クエリ内で指定します。内部結合を使用したクエリを実行すると、結合の対象となる両方のテーブルに共通の値が存在する行のみが、クエリ操作の対象となります。

内部結合の用途

内部結合は、対象となるテーブルの両方で、結合するフィールドが一致する行のみを返す場合に使用します。

内部結合の使用方法

多くの場合は、内部結合を使用するために特別な操作は必要ありません。リレーションシップ ウィンドウ (リレーションシップ ウィンドウ: テーブルおよびクエリ間のリレーションシップを表示、作成、および変更するためのオブジェクト タブ。)でテーブル間に作成済みのリレーションシップがある場合、該当する両テーブルをクエリのデザイン ビュー (デザイン ビュー: データベース オブジェクトのデザインを表示するビュー。テーブル、クエリ、フォーム、レポート、およびマクロで使用できます。デザイン ビューでは、新しいデータベース オブジェクトの作成や、既存のオブジェクトのデザイン変更を行うことができます。)で追加すると、内部結合が自動的に作成されます。参照整合性 (参照整合性: レコードを追加、更新、または削除するときに、テーブル間に定義されているリレーションシップを保持するために従う規則。)が適用されている場合、結合線の上には、一対多リレーションシップ (一対多リレーションシップ: 主テーブルの各レコードの主キーの値が、関連テーブルの複数のレコードの一致するフィールドの値に対応する、2 つのテーブル間の関連付けです。)の "一" の側のテーブルには "1" が表示され、"多" の側のテーブルには無限大記号 ("∞") が表示されます。

リレーションシップを作成していない場合でも、クエリに追加した 2 つのテーブルのそれぞれに、同じデータ型または互換性のあるデータ型のフィールドがあり、一方の結合フィールドが主キー (主キー: テーブル内の各レコードを一意に識別する値を持つフィールド (列)。主キーには Null 値を含めることができません。また、必ず一意のインデックスを持つ必要があります。主キーは、テーブルと他のテーブルの外部キーを関連付ける際に使用されます。)の場合には、内部結合が自動的に作成されます。この場合は、参照整合性は適用されていないため、"一" と "多" の記号は表示されません。

クエリの中で、リレーションシップを作成していないクエリどうしを使用する場合、それらのクエリ間の内部結合や、クエリとテーブル間の内部結合は、自動的には作成されません。通常は自分で作成する必要があります。内部結合を作成するには、一方のデータ ソースのフィールドを他のデータ ソースのフィールドにドラッグします。2 つのフィールドの間には、結合が作成されたことが示す線が表示されます。

表示内部結合の SQL 構文

SQL では、次に示す例のように、FROM 句で内部結合を指定します。

FROM table1 INNER JOIN table2 ON table1.field1compopr table2.field2

INNER JOIN 操作には、次の指定項目があります。

指定項目 説明
table1table2 結合するレコードのあるテーブルの名前。
field1field2 結合するフィールドの名前。フィールドが数値型でない場合は、両方のフィールドが同じデータ型 (データ型: 保持できるデータの種類を決定するフィールドの特性。主なデータ型としては、ブール型 (Boolean)、整数型 (Integer)、長整数型 (Long)、通貨型 (Currency)、単精度浮動小数点数型 (Single)、倍精度浮動小数点数型 (Double)、日付型 (Date)、文字列型 (String)、バリアント型 (Variant) (既定値) があります。)で、格納されるデータが同じ種類である必要があります。ただし、同じ名前である必要はありません。
compopr "="、"<"、">"、"<="、">="、"<>" などの比較演算子。

内部結合の構文の詳細については、「INNER JOIN 操作」を参照してください。


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

外部結合

外部結合の場合は、結合の両側で完全に一致する行だけではなく、一方のテーブルのすべての行と、もう一方のテーブルの行のうちで結合の両側で同じ値を持つものをクエリの対象とするよう指定します。

外部結合には左結合と右結合があります。左結合の場合、SQL ステートメントの FROM 句の最初のテーブルは、すべての行が対象となります。他のテーブルは、結合するフィールドの値が両方のテーブルで一致する行のみが対象となります。右結合の場合、SQL ステートメントの FROM 句の 2 番目のテーブルは、すべての行が対象となります。他のテーブルは、結合するフィールドの値が両方のテーブルで一致する行のみが対象となります。

 メモ   特定の結合で、どのテーブルが左結合であるか右結合であるかは、結合をダブルクリックし、[結合プロパティ] ダイアログ ボックスで確認するだけで簡単に判断できます。また、SQL ビューに切り替えて FROM 句を確認することもできます。

外部結合の一方の側の行の中には、もう一方のテーブルには一致する行がないものがあります。クエリ結果で返されるフィールドでは、一致する行がない側のテーブルのフィールドは空となります。

外部結合の用途

外部結合は、結合の一方のテーブルからはすべての行を結果に取り込み、さらに、もう一方のテーブルの行からは、1 つ目のテーブルと結合フィールドが一致する行のみを取得する場合に使用します。

外部結合の使用方法

外部結合は、内部結合を修正して作成します。

内部結合を外部結合に変更する

  1. クエリのデザイン ビューで、変更する結合をダブルクリックします。

[結合プロパティ] ダイアログ ボックスが表示されます。

  1. [結合プロパティ] ダイアログ ボックスで、2 番と 3 番のオプションを参照します。
  2. 使用するオプションをクリックし、[OK] をクリックします。
  3. 結合が表示され、すべての行が取り込まれるデータ ソースから、結合条件を満たす行のみが取り込まれるデータ ソースに向かって、矢印が表示されます。

表示外部結合の SQL 構文

SQL では、次に示す例のように、FROM 句で外部結合を指定します。

FROM table1 [ LEFT | RIGHT ] JOIN table2
ON table1.field1compopr table2.field2

LEFT JOIN 操作および RIGHT JOIN 操作には、次の指定項目があります。

指定項目 説明
table1table2 結合するレコードのあるテーブルの名前。
field1field2 結合するフィールドの名前。両方のフィールドが同じデータ型 (データ型: 保持できるデータの種類を決定するフィールドの特性。主なデータ型としては、ブール型 (Boolean)、整数型 (Integer)、長整数型 (Long)、通貨型 (Currency)、単精度浮動小数点数型 (Single)、倍精度浮動小数点数型 (Double)、日付型 (Date)、文字列型 (String)、バリアント型 (Variant) (既定値) があります。)で、格納されるデータが同じ種類である必要があります。ただし、同じ名前である必要はありません。
compopr "="、"<"、">"、"<="、">="、"<>" などの比較演算子。

外部結合の構文の詳細については、「LEFT JOIN 操作および RIGHT JOIN 操作」を参照してください。


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

クロス結合

クロス結合は、内部結合や外部結合とは違って、Office Access 2007 では明示的に表現されません。クロス結合では、一方のテーブルのすべての行が、もう一方のテーブルのすべての行と結合され、外積やデカルト積と呼ばれる結果が得られます。明示的に結合していないテーブルを使用したクエリを実行すると、その結果は外積となります。クロス結合は、意図せずに使われるのが一般的ですが、有用な場合もあります。

クロス結合の用途

2 つのテーブルまたはクエリの行のすべての組み合わせを調べる場合には、クロス結合を使用します。たとえば、自社のこの 1 年間の業績が非常に好調だったため、顧客への還元を計画しているとします。その場合、各顧客の購入額の和を求めるクエリと、還元率の一覧を表す小さなテーブルを作成したうえで、クロス結合で両者を結合する別のクエリを実行します。このクエリでは、各顧客の還元額の候補の一覧が表示されます。

クロス結合の使用方法

クエリの中で、複数のテーブルまたはクエリを使用し、各テーブルまたはクエリに対して明示的な結合を 1 つも作成しなかった場合には、クロス結合が生成されます。明示的に結合していない各テーブルまたは各クエリのそれぞれの行を、他の各テーブルまたは各クエリのそれぞれの行と結合したものが結果として得られます。前述の還元額の例で考えてみましょう。顧客の数が 91、還元率の候補の数が 5 だった場合、クロス結合で得られる行の数は 455 (91 と 5 の積) です。

意図しないクロス結合では、膨大な数の行がクエリ結果として生成される可能性があります。しかも、これらの結果は、多くの場合は無意味です。各行どうしをすべて結合するという意図がない場合には、結合結果に含まれる行の大半は、意味をなさないからです。さらには、意図しないクロス結合を使用しているクエリは、実行に非常に長い時間を要することがあります。

クエリのデザイン ビューでの意図しないクロス結合

クエリのデザイン ビューでの意図しないクロス結合
コールアウト 1 丸で囲んだフィールドどうしを結合する必要があります。

意図しない外積

意図しないクロス結合で返された外積
コールアウト 1 膨大なレコード数となっています。

正しいクエリ結果

正しい結合を作成した後の結果
コールアウト 1 レコード数がずっと少なくなっています。

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

不等結合

結合は、結合するフィールドが等しいという条件に必ずしも基づく必要はありません。結合の条件では、任意の比較演算子を使用できます。たとえば、より大きい (>)、より小さい (<)、等しくない (<>) などです。等しいという条件に基づかない結合は、不等結合と呼ばれます。

不等結合の用途

2 つのデータ ソース間で等しくないフィールド値に基づいて行を結合する場合には、不等結合を使用します。一般に、不等結合では、より大きい (>)、より小さい (<)、以上 (>=)、または以下 (<=) の各比較演算子を条件として使用します。等しくない (<>) 演算子に基づく不等結合では、クロス結合と同様に非常に多数の行が返る場合があり、結果の意味を判断しづらいことがあります。

不等結合の使用方法

不等結合はデザイン ビューではサポートされていません。SQL ビューを使用する必要があります。ただし、デザイン ビューで結合を作成した後で SQL ビューに切り替え、等号 (=) の比較演算子を探し、目的の演算子に変更することはできます。その後で、デザイン ビューでクエリを再度開くには、まず SQL ビューで比較演算子を等号 (=) に戻す必要があります。

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

結合を削除する

データ型が一致しないフィールドどうしを結合するなど、誤って作成した結合は削除できます。結合を削除するには、次の操作を行います。

  1. クエリ デザイン グリッドで、削除する結合をクリックします。
  2. Del キーを押します。

または

  • クエリ デザイン グリッドで、削除する結合をマウスの右ボタンでクリックし、Del キーを押します。

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

 
 
適用対象:
Access 2007