データベースでは正規化をする際に、重複するレコードは別のテーブルに保存し、各キー項目でリレーションを設定することで、データの整合性等を担保します。
テーブルをキー項目で結合する際に、起点とするテーブルの全レコードを表示するか、またはキー項目で結合できるレコードを表示するかで、その結合方法が変わります。今回は、テーブル結合に際して、内部結合と外部結合について紹介をします。
サンプルデータについて
今回の説明に際しては、次のようなテーブルを作成します。
表1 結合操作テーブル
フィールド名 | データ型 |
品目ID | オートナンバー型 |
品目 | 短いテキスト |
単価 | 通貨型 |
表2 結合操作サブテーブル
フィールド名 | データ型 |
メインID | オートナンバー型 |
品目ID | 数値型 |
購入数量 | 数値型 |
ここで、これらテーブルは「品目ID」フィールドでリレーションを設定することになります。
次に、サンプルデータを見ていきましょう。
表3 結合操作テーブルに保存したサンプルデータ
品目ID | 品目 | 単価 |
1 | 鉛筆 | ¥100 |
2 | 消しゴム | ¥120 |
3 | 定規 | ¥80 |
4 | ボールペン | ¥110 |
5 | コンパス | ¥200 |
表4 結合操作サブテーブルに保存したサンプルデータ
メインID | 品目ID | 購入数量 |
1 | 1 | 10 |
2 | 3 | 5 |
3 | 4 | 1 |
4 | 2 | 9 |
それでは、これらデータを用いて結合方法を見ていきましょう。
内部結合について(INNER JOIN)
今回のサンプルデータの場合、「品目ID」フィールドの値で、「結合操作テーブル」と「結合操作サブテーブル」のリレーションを設定します。まず、テーブルの結合に先立ってサンプルクエリを作成します(今回は、「結合操作について」というクエリ名称にしました。)。
図1に示すように、 クエリ設定画面にテーブルの追加で「結合操作テーブル」と「結合操作サブテーブル」を挿入します。続いて、結合操作テーブルの「品目ID」フィールドを結合操作サブテーブルの「品目ID」までドラッグアンドドロップします。これにより「品目ID」フィールド間でのテーブル結合ができました。
さて、この結合操作により、どのようにレコードが表示されるかを見てみます。クエリの【フィールド】項目に「品目」、「単価」及び「購入数量」フィールドを設定した後、表示アイコン中のデータシートビューに切り替えてください。すると、表5に示す結果が得られます。
表5 結合操作テーブルと結合操作サブテーブルを内部結合した結果
品目 | 単価 | 購入数量 |
鉛筆 | ¥100 | 10 |
消しゴム | ¥120 | 9 |
定規 | ¥80 | 5 |
ボールペン | ¥110 | 1 |
この出力方法は、主となるテーブル(今回の場合は、「結合操作テーブル」が主となるテーブルになります。)と副となるテーブル(今回の場合は、「結合操作サブテーブル」)の両方にレコードがある場合に、対象となるレコードを結合をした形で表示します。そして、このようなテーブル間の結合方法を「内部結合」と呼びます。
内部結合の場合、結合するテーブル間のレコードが一致するものだけを出力することになるため、「結合操作サブテーブル」にレコードがない「コンパス」については出力されません。
なお、図1に示す方法では、自動的に内部結合が採用されます。
また、この際のSQL文は次のように記載されます。
SELECT 結合操作テーブル.品目, 結合操作テーブル.単価, 結合操作サブテーブル.購入数量
FROM 結合操作サブテーブル INNER JOIN 結合操作テーブル ON 結合操作サブテーブル.品目ID = 結合操作テーブル.品目ID;
ここで、着目していただきたい点は、「FROM A INNER JOIN B ON A.field = B.field」の記載です。これは、Aのテーブルを主に、Bのテーブルを副とし、A.fieldとB.fieldに一致するレコードを結合して出力するという意味になります。
外部結合について(OUTER JOIN / RIGHT JOIN)
内部結合では、主テーブルと副テーブルを結合するためのフィールドに同じデータが登録されていることが前提でした。先の例を考えると、「品目ID」でコンパスに相当する「5」が両テーブルになかったためレコード表示がされませんでした。しかしながら、購入数量がなくても、全品目の一覧を確認したい場合があります。この場合、内部結合ではなく外部結合をする必要がありますので、その方法を見ていきましょう。
まずは、先ほど作成したクエリのリレーション線を右クリックし、「結合プロパティ」を選択します。結合プロパティダイアログボックスが表示されるため、「3: 結合操作テーブルの全レコードと結合操作サブテーブルの同じ結合フィールドのレコードだけを含める。」を選択します。
これにより、リレーション線が結合操作テーブルの「品目ID」から結合操作サブテーブルの「品目ID」に向かった矢印になります。続いて、データシートビューでレコードを表示すると、今度は「コンパス」のレコードも含んだ結果が出力されるようになります。ただし、結合操作サブテーブルに「コンパス」に該当するレコードがないため、結合操作サブテーブルに属する「購入数量」フィールドの値は空白になっています。このような結合方法を「外部結合」と呼びます。
品目 | 単価 | 購入数量 |
鉛筆 | ¥100 | 10 |
消しゴム | ¥120 | 9 |
定規 | ¥80 | 5 |
ボールペン | ¥110 | 1 |
コンパス | ¥200 |
こちらについても、SQL文を確認してみましょう。
SELECT 結合操作テーブル.品目, 結合操作テーブル.単価, 結合操作サブテーブル.購入数量
FROM 結合操作サブテーブル RIGHT JOIN 結合操作テーブル ON 結合操作サブテーブル.品目ID = 結合操作テーブル.品目ID;
ここで、着目していただきたい点は、「FROM A RIGHT JOIN B ON A.field = B.field」の記載です。これは、Aのテーブルを主に、Bのテーブルを副とし、A.fieldとB.fieldで結合し、かつ、AのテーブルにBのテーブルと一致するレコードが無くてもAテーブルのレコードは全て出力するという意味になります。なお、RIGHT JOINの代わりにLEFT JOINとすると、Bテーブルが主、Aテーブルが副となります。
まとめ
今回は、テーブル間の結合方法として内部結合と外部結合を紹介しました。クエリの操作でこれら結合を簡単に設定することができますが、どのようなレコードを出力したいかによって、その結合方法を選択するように設計をしてください。そして、結合方法を上手く活用することでデータの抽出を効率的に行い、業務の改善を図っていただければと思います。
スポンサーリンク
コメント