SQLの基本

Access VBA SQLの書き方3 INNER JOIN テーブルの結合

SQLの書き方3 INNER JOIN テーブルの結合

前回はWHERE句の説明を行いましたので今回はテーブル同士の結合を行うSQL文の書き方を説明していきます。

INNER JOIN

テーブル同士の結合は「INNER JOIN」を使用します。

sqlkakikata09

Accessのクエリで使用するテーブル同士の結合です。
この結合をSQLで表現するには「INNER JOIN」を使用します。

SELECT テーブル名1.*,テーブル名2.* FROM テーブル名 INNER JOIN テーブル名2 ON テーブル名1.フィールド名 = テーブル名2.フィールド名

例 (データベース作成講座で使用している「T_社員マスタ2013」、「T_性別マスタ」を使います。)

SQL = “SELECT T_社員マスタ2013.*, T_性別マスタ.* FROM T_社員マスタ2013 INNER JOIN T_性別マスタ ON T_社員マスタ2013.性別コード = T_性別マスタ.性別コード”

このSQLを実行すると、「T_社員マスタ」と「T_性別マスタ」をフィールド「性別コード」で結合した抽出結果が得られます。
また、SQLの書き方2で説明したWHERE句を使用する場合は、末尾に「WHERE T_社員マスタ2013.性別コード=’0’」を追加します。

SQL = “SELECT T_社員マスタ2013.*, T_性別マスタ.* FROM T_社員マスタ2013 INNER JOIN T_性別マスタ ON T_社員マスタ2013.性別コード = T_性別マスタ.性別コード WHERE T_社員マスタ2013.性別コード=’0′”

では実際にプログラムを作成してみましょう。
(使用するフォームはSQLの書き方1と同じものを使用しています。)

INNER JOINを使用したプログラム例

Private Sub コマンド0_Click()

Dim CN As ADODB.Connection
Dim RS As ADODB.Recordset
Dim SQL As String

Set CN = CurrentProject.Connection
Set RS = New ADODB.Recordset

SQL = “SELECT T_社員マスタ2013.*, T_性別マスタ.* FROM T_社員マスタ2013 INNER JOIN T_性別マスタ ON T_社員マスタ2013.性別コード = T_性別マスタ.性別コード WHERE T_社員マスタ2013.性別コード=’0′”

RS.Open SQL, CN, adOpenStatic, adLockOptimistic

If RS.EOF = False Then

Do Until RS.EOF

Debug.Print RS!社員コード & RS!名前 & RS!性別

RS.MoveNext
Loop

End If

RS.Close: Set RS = Nothing
CN.Close: Set CN = Nothing

End Sub

前回と同様に「イミディエイトウィンドウ」に抽出結果を表示します。
また、今回は「社員コード」と「名前」と「性別」を表示させています。

sqlkakikata10

「社員コード」と「名前」及び「性別」(男)が表示されていれば成功です。

今回は「INNER JOIN」(内部結合)でSQLを作成しましたが、左外部結合、右外部結合もSQLで作成することが出来ます。

sqlkakikata11
「左外部結合」→LEFT JOIN

sqlkakikata12
「右外部結合」→RIGHT JOIN

長くなったSQL文の対処

「INNER JOIN」を使い、結合するテーブル名が増えだすとSQL文も長くなります。
SQL文が長くなりすぎるとVBの画面に入りきれなくなり、構文の確認が難しくなります。
プログラムの作成者により、構文の書き方は異なると思いますが私の場合は以下のように記述します。

SQL = “SELECT T_社員マスタ2013.*, T_性別マスタ.* FROM T_社員マスタ2013 INNER JOIN T_性別マスタ ON T_社員マスタ2013.性別コード = T_性別マスタ.性別コード WHERE T_社員マスタ2013.性別コード=’0′”

これを↓

SQL = “SELECT T_社員マスタ2013.*, T_性別マスタ.* ” _
& “FROM T_社員マスタ2013 INNER JOIN T_性別マスタ ” _
& “ON T_社員マスタ2013.性別コード = T_性別マスタ.性別コード ” _
& “WHERE T_社員マスタ2013.性別コード=’0′”

もしくは↓

SQL = “SELECT ”
SQL = SQL & “T_社員マスタ2013.*, ”
SQL = SQL & “T_性別マスタ.*, ”
SQL = SQL & “T_社員マスタ2013.性別コード ”
SQL = SQL & “FROM ”
SQL = SQL & “T_社員マスタ2013 ”
SQL = SQL & “INNER JOIN T_性別マスタ ”
SQL = SQL & “ON T_社員マスタ2013.性別コード = T_性別マスタ.性別コード ”
SQL = SQL & “WHERE ”
SQL = SQL & “(((T_社員マスタ2013.性別コード)=’0′))”

どちらも、同じ構文です。
私は後者を多用します。

いかがでしょうか?
今回は「INNER JOIN」を使用して、テーブル同士の結合を行いました。