SQL FROM句:テーブルの結合の考え方
「社員マスタ」と「部署マスタ」というテーブルがあります。社員はそれぞれ1つの部署に所属しています。
| 社員コード | 社員名 | 部署コード |
|---|---|---|
| 1 | テスト社員1 | 1 |
| 2 | テスト社員2 | 2 |
| 3 | テスト社員3 | 1 |
| 部署コード | 部署名 |
|---|---|
| 1 | 開発部 |
| 2 | 営業部 |
社員と所属部署の一覧を表示したい。
SQLは下記のようになります。
SELECT T1.社員名, T2.部署名
FROM 社員マスタ AS T1
JOIN 部署マスタ AS T2
ON T1.部署コード = T2.部署コード社員名は社員マスタ、部署名は部署マスタから取得するため、FROM句で複数のテーブルを指定する必要があります。
部署コードのように、複数のテーブルで同名のカラム名がある場合は、社員マスタ.部署コードのように、どのテーブルのカラムなのか明示する必要があります。
社員マスタ AS T1のように、FROM句でテーブルを指定する際に、別名を定義することができ、T1.社員マスタというようなテーブル名での指定が可能になります。
複数のテーブルを指定するには、JOIN句を使用し、テーブル同士を結合します。
ON T1.部署コード = T2.部署コードの部分で、結合条件を指定しています。
結合条件
下記のように結合条件を1=1(常に条件を満たす=条件を指定しない)にして実行した場合を見てみます。
SELECT T1.社員名, T2.部署名
FROM 社員マスタ AS T1
JOIN 部署マスタ AS T2
ON 1=1| 社員名 | 部署名 |
|---|---|
| テスト社員1 | 開発部 |
| テスト社員1 | 営業部 |
| テスト社員2 | 開発部 |
| テスト社員2 | 営業部 |
| テスト社員3 | 開発部 |
| テスト社員3 | 営業部 |
1社員につき2レコード表示されてしまいます。
結合条件を指定しないと、指定したテーブル同士で考えられるすべての組み合わせ(直積)を出力してしまいます。
社員マスタが3件(3通り)と部署マスタが2件(2通り)で、3通り×2通り=6通り(件)出力されることになります。
わかりやすくするために、社員マスタの部署コードと、部署マスタの部署コードを表示させます。
SELECT T1.社員名
,T2.部署名
,T1.部署コード AS 社員_部署コード
,T2.部署コード AS 部署_部署コード
FROM 社員マスタ AS T1
JOIN 部署マスタ AS T2
ON 1=1| 社員名 | 部署名 | 社員_部署コード | 部署_部署コード |
|---|---|---|---|
| テスト社員1 | 開発部 | 1 | 1 |
| テスト社員1 | 営業部 | 1 | 2 |
| テスト社員2 | 開発部 | 2 | 1 |
| テスト社員2 | 営業部 | 2 | 2 |
| テスト社員3 | 開発部 | 1 | 1 |
| テスト社員3 | 営業部 | 1 | 2 |
赤背景の行は、社員マスタの部署コードとは違う部署の部署名を出力しているので、本来は出力してはいけないデータです。
社員マスタの部署コードに紐づく部署名を出力したいので、結合条件で社員マスタ.部署コード=部署マスタ.部署コードと指定します。