JOIN)エクセルVBAでデータベースを扱うためのSQL入門です。前回データベースの正規化を説明し、マスターデータとトランザクションデータとしてそれぞれのテーブルを作成しました。分割されたデータは結合しなければ必要な情報がそろいません。複数テーブルの情報を必要に応じて結合して取得できるようになると、よりデータベースおよびSQLの利便性が感じられるはずです。エクセルでは、SUMIF,COUNTIF,VLOOKUP,INDEX,OFFSET等々、これらの関数で他シートの情報を取得できます。これらは、元表に対して情報を追加するものになりますが、SQLではより高度に複数の表を合体させる事が出来ます。その合体させる方法がSQLには複数用意されています。使用するテーブル定義は以下になります。全テーブル定義とテーブル自動作成VBAデータベースの正規化とマスタの作成で作成した全テーブル定義と、テーブル名変更と列追加(ALTERTABLE)とテーブル自動作成で作成したテーブル自動作成VBAを掲載しておきます。エクセルVBAでデータベースを扱うためのSQL入門です。前回までにテーブルを作成したり、削除したりできるようになりました。テーブルの結合方法2つのテーブルを結合して1つのデータにする場合は、良く使う代表的な結合方法として3通りあります。JOIN両方のテーブルに結合条件を満たす行があるデータのみになります。右のテーブルの全ての行に対して、左のテーブルは結合条件を満たす行だけになります。上記3通り以外の結合方法としては、以下のような結合方法もあります。JOIN両方のテーブルを優先として、結合条件の一致/不一致にかかわらず、両方のテーブルの全ての行が対象となります。※SQLiteではサポートされていません。JOIN2つのテーブルの全ての組み合わせを取得する結合方法です。2つのテーブルの直積(デカルト積)になります。取得されるデータ量が極めて多くなるので、使用範囲はかなり限定されます。自然結合:NATURALNATURALキーワードを指定することで、結合条件としてそれぞれのテーブルで同じ名前のカラムが自動的に使用されます。実際には、テーブル定義時にカラム名をかなり入念に検討しなければ使えないでしょう。何よりSQLだけでは判断できないので、使用する機会はほとんどないと思います。列名修飾とエイリアス列名修飾1つのSQL文に2つ以上のテーブルを指定する場合には、カラム名が重複してしまいどのテーブルのカラムかが一意に決まらない場合が出てきます。そこで、どのテーブルのカラムかを指定する修飾子が必要になってきます。カラム名に対してテーブルを指定する場合は、テーブル名.カラム名このように、.(ドット、ピリオド)を使ってテーブルを指定します。列名が一意に決まらない場合、SQLはエラーとなります。複数のテーブルにおいて重複していないカラム名はテーブル修飾は必要ありません。SQLを見た時、どのテーブルの列か判断できなくなってしまうのでテーブル修飾は必ず行うようにします。エイリアス列名(カラム名)には別名(エイリアス)を付けられることは既に紹介しました。同様に、テーブル名にも別名(エイリアス)を付けられます。※[AS]を記述できない※ASを記述できないデータベースもあります。※エイリアスの大文字小文字は統一してください、大文字小文字が違うとエラーになる場合があります。Tt_salesの別名にTを指定し、そのT.でカラム名を修飾しています。条件が一致したデータのみ抽出します。結合条件には、ANDやORを使った論理式を記述できます。M.code両方のテーブルのcodeカラムが一致している行のみが対象となります。結合条件[OUTER]は省略できます。結合条件に合致するテーブル名2の存在有無に関わらず、テーブル名1の全行が対象になります。M.codeテーブル名1は常に全行が対象となります。テーブル名2の合致するデータがない行では、テーブル名2のフィールドはNULLになります。結合条件[OUTER]は省略できます。結合条件に合致するテーブル名1の存在有無に関わらず、テーブル名2の全行が対象になります。M.codeテーブル名2は常に全行が対象となります。テーブル名1の合致するデータがない行では、テーブル名1のフィールドはNULLになります。JOINは、単に左右が入れ替わっただけの違いになります。したがって、どちらか一方のみの使用に統一すべきです。JOINで統一するのが一般的になります。JOINに統一して使用していきます。結合したテーブルに結合条件の行が存在しない場合、フィールドはNULLになります。M.codet_salesのcodeに一致するm_customerが無い場合、M.nameはNULLになります。IFNULL)することで行えます。以下のクラスを使用して、JOINを使ったSQLを発行するVBAサンプルです。VBAクラスの全コード:データの取得SQL入門の「データの取得:条件指定(SELECT,WHERE)」時点のVBAクラスの全コードです。Sub※イミディエイ等でsSqlを見た時に見やすいようにvbCrLfを入れています。t_salesとm_customerを内部結合(一致するものだけ)し、そこにm_itemを外部結合しています。外部結合しているm_itemのitem_nameはデータが無い時には'マスタなし'となります。JOINを使用しています。両方のテーブルに存在するカラム(ここではcode)は、どちらのテーブルを使用しても同じです。したがって上記SQLのSELECTでは、T.codeの代わりにM1.codeとしても結果は同じになります。※前回作成したマスタ前回作静したマスタは、全てのデータの整合性を取っているので、INNERでもLEFTでも結果は同じになってしまいます。それぞれのテーブルにデータを追加して、JOINの違いを確認しておきましょう。JOINを使わない内部結合JOINを使わずに複数のテーブルを結合するSQLの書き方があります。M.codeこれは以下のようにJOINを使わずにSQLを書くことができます。M.codeこの書き方では外部結合を書くことはできません。(ただしOracleには(+)で外部結合する書き方があります。)このSQLの書き方は古い書き方とされていて、現在は使うべきではありません。書かれているSQLで使われている場合もあるので、読めるようにはしておきましょう。テーブルを結合して取得の最後にテーブルの結合は、SQLの重要かつ基本になります。JOINこの2つだけになりますので、これはしっかり習得しておきましょう。JOINは横にデータを結合するものでしたが、SQLではデータを縦に連結することもできます。次回はこの縦に連結する、複数のSELECTした結果を統合するUNIONについて解説します。JOIN)このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。GASスプレッドシート入門スプレッドシート応用GAS入門GAS応用トップSQL入門テーブルを結合して取得このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。