- Accessクエリの結合の設定を深く理解できる
- やや高度な設定(完全外部結合)の方法も分かる
前回はAccessで選択クエリを作る方法について解説しましたが、入門者の方が全体の流れを把握できる程度の内容に仕上げています。
【Accessクエリ入門】1回目-デザインビューで選択クエリを作る
今回は、前回では書ききれなかった結合の設定についてさらに深掘りしていきます。
Accessクエリでは、テーブル同士で結合するためには3つの方法があります。
クエリの結合について正しく知らないと、クエリにクエリを重ねる質の悪いクエリが出来てしまい、使いづらいデータベースに仕上がってしまいます。
つまり、一つの結果を求めるのに、まわりくどい方法を選択してしまうということになります。
結合の設定をしっかりと知っておくと一発で欲しいデータを出せるようになるので、しっかりと学んでいきましょう!
また、本記事ではやや難しめの結合設定になる完全外部結合についても解説していきます。
SQLビューでの編集に興味のある方はぜひ挑戦していただければと思います。
今回の学習用のデータベースはこちらからダウンロードしてください。
データベースを開くと「クエリ1」が作られていますが、今回の学習の主役になります。
「クエリ1」をデザインビューで開くと、テーブル間で結合が設定されています。
テーブル結合のプロパティを表示させる
前記事でも軽く触れましたが、結合を右クリックするとプロパティを表示することができます。
プロパティのウインドウを確認すると、3つの設定を選択できるようになっていますよね。
上から順に
- 内部結合(INNER JOIN)・・・両方のテーブルの条件を満たしている
- 左側外部結合(LEFT JOIN)・・・左側のテーブルのレコードを全て表示
- 右側外部結合(RIGHT JOIN)・・・右側のテーブルのレコードを全て表示
となっています。
下の2つは右か左かだけの違いだけなので、「片側外部結合」としてまとめて解説します。
では、さっそく進めていきましょう。
内部結合を設定
結合を追加したときには「内部結合」が初期設定になっていて、両方のテーブルに含まれたデータが表示されます。
「クエリ1」のデータシートビューを確認すると、左側(部品マスタ)と右側(発注伝票)の両方とも抜けなく商品名が入っています。
3つの結合の中でも「内部結合」が最もよく使われていて、ほとんどのことは「内部結合」だけで解決できます。
片側外部結合を設定
片側外部結合は、指定した方のテーブルの全データを表示させることができる結合です。
「発注伝票側に無い商品データ」などのように、内部結合では表示されないデータについては片側外部結合を活用することになります。
それでは、実際に片側外部結合を設定してみましょう。
結合プロパティで2番目の「T01部品マスタの全レコードに・・・」を選択します。
結合プロパティを閉じると、結合の形が矢印になっているのが分かります。
データシートビューを確認すると、発注伝票側には無いデータが表示されているのが分かります。
片側外部結合を設定することにより、発注されたことの無い部品についても一発で知ることができました。
右側外部結合についても同じで、3番目の結合を指定するだけで実現できます。
また、デザインビューで表示される矢印は左側とは逆になります。
ここで、「どちらのテーブルが左側で、どっちが右側になるの?」という疑問が沸いてきませんでしたか?
結合プロパティをよく確認すると、左上に「左のテーブル名」とあります。
ここでは「T01部品マスタ」が左側のテーブルに指定されていることになります。
このように、テーブルの左右の指定については結合プロパティを見れば知ることができますので、分からなくなったら開いてみましょう。
完全外部結合について
「片側外部結合」という設定を知ってしまうと、両方のテーブルの全データを指定する方法はないのかという疑問が沸くかもしれません。
そのような結合は、データベース用語では完全外部結合(OUTER JOIN)と呼ばれています。
残念ながら、Accessのクエリでは簡単に完全外部結合を作ることはできませんが、下の手順同じ結果を表示することができます。
- 片側外部結合を作る
- 不一致クエリを作る(ウィザードを活用)
- 2つのクエリをユニオンで組み合わせる
しかし、そのまま上の手順を重ねると、1つの目的を達成するために3つのクエリを作ることになってしまいます。
過去の記事でも触れていますが、クエリを重ねて作ったままにしておくのは、オブジェクトブラウザも見にくくなって管理しづらくなりますのでできるだけ避けましょう。
そんな時はSQL文で一つにまとめるのがよりベターな方法でしょう。
実際には下のようなコードになります。
SELECT T01部品マスタ.品名 AS 部品マスタ側, T02発注伝票明細.品名 AS 発注伝票側
FROM T01部品マスタ LEFT JOIN T02発注伝票明細 ON T01部品マスタ.部品登録ID = T02発注伝票明細.部品登録ID
UNION SELECT T01部品マスタ.品名 AS 部品マスタ側, T02発注伝票明細.品名 AS 発注伝票側
FROM T02発注伝票明細 LEFT JOIN T01部品マスタ ON T02発注伝票明細.[部品登録ID] = T01部品マスタ.[部品登録ID]
WHERE T01部品マスタ.部品登録ID Is Null;
SQLビューに貼り付けてデータシートビューで結果を確認すると、両テーブルの全データが表示されているかと思います。
クエリをVBAコードなどに組み込むなど、自動化するのが目的ならばSQL文を作るひと手間をかけてもいいのではないでしょうか?
一方、SQL SERVERなどの商用データベースであれば「OUTER JOIN」の一文で済みます。
データベースを選定するための材料として頭の中にいれておくとよいでしょう。
複数のフィールドを結合する
じつは、テーブル間で複数の結合を設定することもできます。
例えば、年度単位で部品データを持っている場合などは、「部品ID」だけでなく「年度」も結合できるというわけです。
外注や委託によって作られた基幹システムなどは、できるだけ改修する必要がないよう、年別や月別にデータを重複して持たせるという設計になっていることもあります。
そのような基幹システムからODBC経由でデータを活用しようとした場合、複数の結合設定というのはよく使われますので頭の中に入れておきましょう。
まとめ
今回はAccessクエリで結合を設定する方法についてより深堀りしてみました。
クエリのデザインビューには、結合を簡単につくることができるという便利な機能があります。
いくつもの結合をSQLビューでイチから書いていくのはとても大変ですが、デザインビューを使えば直観的に結合を設定できます。
まずはクエリのデザインビューで結合を作り、SQLビューで軽い手直しを行うのがよりシンプルで分かりやすい方法でしょう。
内部結合をいくつも組み合わせるパターンだけでほとんどの選択クエリを作れますが、ときどき片側外部結合が必要になることもあります。
内部結合に慣れてきたら、片側外部結合も少しづつ使っていくことで、クエリによるデータ加工スキルがさらに上達します。
Accessクエリを使ってデータを加工するためには結合の習得がとても大事になってきますので、頑張ってマスターしましょう。
本日もありがとうございました。