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

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

「社員コード」と「名前」及び「性別」(男)が表示されていれば成功です。
今回は「INNER JOIN」(内部結合)でSQLを作成しましたが、左外部結合、右外部結合もSQLで作成することが出来ます。
長くなった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」を使用して、テーブル同士の結合を行いました。