Accessの結合についてお探しですね。
広告
複数のテーブルをつなごう!Accessクエリの結合、これでバッチリわかる
Accessで仕事のデータをまとめたり、集計したりしていると、必ずぶつかるのが「テーブルをつなぐ」という壁です。
「クエリでテーブルをつないだら、あるはずのデータが消えちゃった!」とか、「3つ以上のテーブルをつなごうとしたらエラーが出て先に進めない…」なんて経験、ありませんか?こういうトラブルのほとんどは、「内部結合」と「外部結合(Left Join)」という2つの結合方法の違いをきちんと理解して、Accessのルール通りに設定すれば解決できるんです。
この記事では、Accessのクエリ機能を使いこなして、複数のテーブルを思い通りにつなぐためのコツをわかりやすく解説します。
初心者の方がつまずきやすいポイントもしっかりカバーしているので、ぜひAccessを開きながら読んでみてください。
内部結合と外部結合って何が違うの?データの「見え方」を理解しよう
Accessで複数のテーブルを扱うとき、一番つまずきやすいのが「内部結合」と「外部結合」の違いです。
ここを間違えると、集計の数字が合わなくなったり、必要なデータが勝手に消えてしまったりする厄介なことになります。
まずは、この2つの結合方法がどんなふうにデータを取り出すのか、イメージしながら理解していきましょう。
最初に「**内部結合(Inner Join)**」について説明します。
これは、つなぎ合わせる「両方」のテーブルに共通するデータがある場合だけ、レコードを表示する方法です。
たとえば、「売上テーブル」と「商品マスタ」を商品IDでつなぐとします。
内部結合の場合、売上テーブルにデータがあっても、その商品IDが商品マスタに登録されていなければ、その売上データ自体がクエリの結果から消えてしまうんです。
つまり、両方のテーブルで条件がピッタリ一致する部分だけを取り出すのが内部結合。
余計なデータが混ざらないので、データがきちんと整っている場合や、マスタに登録されていない不正なデータを除外したいときには便利です。
でも、「マスタに登録し忘れた」なんて理由で大事な売上データが見えなくなるリスクがあることは、いつも頭に入れておく必要があります。
一方、「**外部結合(Left Join または Right Join)**」は、どちらか一方のテーブルを「メイン」として扱って、そのテーブルのデータは全部必ず表示させる方法です。
さっきの例で言うと、売上テーブルをメインにして外部結合(普通はLeft Join)を使えば、たとえ商品マスタに該当する商品IDがなくても、売上データそのものは消えずに表示されます。
このとき、商品名の欄は空欄(Null)になります。
実際の仕事では、「データが消えちゃう」のを防ぐために、この外部結合をよく使うことになります。
特に、「部署マスタ」と「社員テーブル」をつなぐときなど、まだ部署が決まっていない新入社員もリストに載せたい、なんて場合には外部結合が必須です。
まずは自分が作りたいリストが「完全に一致するものだけ(内部結合)」なのか、「片方のリストは全部残す(外部結合)」なのかをハッキリさせることが、クエリ作成の第一歩です。
Accessのクエリデザイン画面で結合を自由自在に操る方法
理屈がわかったところで、実際にAccessのクエリデザイン画面でどうやって操作すればいいのか、具体的な手順とコツを見ていきましょう。
Accessのいいところは、SQLという難しいプログラム言語を直接書かなくても、マウス操作だけで複雑な結合設定ができることです。
ただ、何も設定せずそのままにしていると、自動的に内部結合になってしまうことが多いので、正しい変更手順を覚えておく必要があります。
クエリデザインビューに2つのテーブルを追加して、共通するフィールド(たとえば顧客IDなど)をドラッグ&ドロップでつなぐと、テーブルの間に「結合線」が引かれます。
この線が細い一本線なら、それは「内部結合」を表しています。
ここから外部結合に変えるには、この結合線をダブルクリック(または右クリックして「結合プロパティ」を選択)します。
すると、「結合プロパティ」というウィンドウが出てきて、1から3までの選択肢が表示されます。
ここが重要なポイントです。
結合プロパティの選択肢は、だいたいこんな意味になっています。
1. **両方のテーブルの結合フィールドが同じ行だけを含める**(これが内部結合)
2. **「(左側のテーブル名)」の全レコードと、「(右側のテーブル名)」の同じ結合フィールドのレコードを含める**(これが左外部結合/Left Join)
3. **「(右側のテーブル名)」の全レコードと、「(左側のテーブル名)」の同じ結合フィールドのレコードを含める**(これが右外部結合/Right Join)
ここで「2」か「3」を選ぶと、デザイン画面の結合線が「矢印付き」の線に変わります。
矢印の根元側にあるテーブルが「メイン(すべてのデータを残す側)」で、矢印の先が向いているテーブルが「サブ(一致するデータだけ持ってくる側)」を表しています。
この矢印の向きを確認するクセをつけるだけで、クエリの設定ミスはグッと減ります。
たとえば「全顧客リストに、注文履歴がある場合はその情報も付けたい」という場合は、顧客テーブルから注文テーブルに向かって矢印が伸びるように設定します。
逆に設定してしまうと、「注文履歴のある顧客しか表示されない」という結果になってしまいます。
常に「どのテーブルを基準に残したいか」を考えながら、結合プロパティを設定しましょう。
3つ以上のテーブルをつなぐときに出るエラーと解決のコツ
実際の仕事では、2つのテーブルだけで済むことは少なくて、3つ、4つと複数のテーブルを数珠つなぎにすることがよくあります。
でも、Accessでこれをやろうとすると、「SQLステートメントの構成が正しくありません」とか「結合式がサポートされていません」、あるいは「あいまいな外部結合が含まれています」といった特有のエラーメッセージが出てきて困ることがあります。
これはAccessが、複数の結合処理をするときに「どの順番で結合すればいいか」を厳密に判断しようとするために起こる現象です。
特に、内部結合と外部結合が混ざっている場合にこの問題がよく起こります。
Accessの仕様上、複数のテーブルを結合する場合は、SQL文の中でカッコ `()` を使って結合の優先順位をハッキリさせる必要があります。
でも、クエリデザイン画面だけで操作していると、このカッコの制御を自動でうまく処理してくれないことがあるんです。
たとえば、テーブルAとテーブルBを外部結合して、さらにテーブルBとテーブルCを内部結合しようとすると、Accessは「どっちを先に処理すればいいかわからない」としてエラー(あいまいな外部結合)を返してきます。
このエラーが出たときの対処法として、結合の向きをすべて統一する(全部左外部結合にするなど)という方法もありますが、論理的にそれができないケースもあるでしょう。
そこで、初心者から上級者まで一番おすすめしたい確実な方法は、**「クエリを部品化して積み上げる」**というやり方です。
無理に1つのクエリで全部のテーブルをつなごうとせず、まずは2つのテーブルを結合した「クエリ1」を作って保存します。
次に、新しいクエリ作成画面で「クエリ1」と「3つ目のテーブル」を読み込んで、それらを結合するんです。
Accessでは「テーブルとテーブル」だけじゃなく「クエリとテーブル」や「クエリとクエリ」も自由に結合できます。
この方法なら、結合の順序がハッキリした状態で次の処理が行われるので、複雑な結合エラーや「あいまいな外部結合」の問題を完全に避けられます。
後からの修正もしやすくなるし、どこでデータが消えたかの確認もしやすくなるので、エラーに悩んだときは「急がば回れ」でクエリを分割することを強くおすすめします。
それでもうまくいかないときは?よくあるトラブルと対処法
ここまで説明した通りに設定しても、まだ「データが表示されない」「エラーが出る」という場合があります。
そんなときにチェックすべきポイントは、結合設定そのものではなく、データの中身や型、あるいはAccess特有の制約にあることが多いです。
ここでは、よくあるトラブルの原因と具体的な対処法をいくつか紹介するので、困ったときの参考にしてください。
一つ目のよくある原因は、**「結合フィールルドのデータ型が一致していない」**ことです。
見た目は同じ数字(たとえば1001)が入っていても、片方のテーブルでは「数値型」、もう片方では「短いテキスト型」で設定されていると、Accessはこれらを別物と判断して結合できません。
「抽出条件でデータ型が一致しません」というエラーが出る場合もありますが、エラーが出ずに単に結果が0件になることもあります。
この場合、テーブルのデザインを変更して型を合わせるのが一番いいんですが、既存システムへの影響で変更できない場合は、クエリ内で変換関数(`CStr`関数や`CLng`関数など)を使って一時的に型を合わせてから結合する必要があります。
計算フィールドを作って、`変換後ID: CStr([数値型ID])`のように書いて、そのフィールドを使って結合しましょう。
二つ目は、**「外部結合した側の抽出条件の罠」**です。
たとえば、テーブルA(全件表示)とテーブルB(外部結合)をつないだ後、テーブルBの項目に対して「特定の値以外を表示する(たとえば`<> “完了”`)」といった条件を設定したとします。
すると、せっかく外部結合で残したはずの「テーブルBのデータが存在しない(Nullの)レコード」まで、この条件によって除外されてしまうことがあるんです。
Accessのクエリでは、Nullは「何らかの値」とは比較できないため、条件指定によってはじかれてしまいます。
これを防ぐには、抽出条件欄に `Is Null Or <> “完了”` と書いて、データが存在しない場合も許可するように明示する必要があります。
最後に、行き詰まったときにチェックすべきポイントをまとめておきますので、一つずつ確認してみてください。
* 結合線は正しい向き(矢印の方向)になっているか?
* 結合するフィールドのデータ型は、数値型同士・テキスト型同士で一致しているか?
* 結合に使っているデータに余計なスペースが入っていないか?
* 外部結合したフィールドに対して、Nullを除外してしまうような抽出条件を書いていないか?
* 3つ以上のテーブル結合でエラーが出る場合、クエリを分割できないか?
Accessのクエリにおける結合は、データベース操作の基本でありながら奥が深い分野です。
でも、この仕組みさえ理解してしまえば、Excelでは不可能な高度なデータ加工や集計が一瞬でできるようになります。
ぜひクエリの分割テクニックや型の確認を活用して、自由自在にデータを操れるようになってください。
広告
