今回から外部結合について学習します。
これはCASE式でもやった集合の考え方が大事になってきます。
例えば下記のようなテーブルCoursesとがあるとします。
name | course
——+———-
赤井 | SQL入門
赤井 | UNIX基礎
鈴木 | SQL入門
工藤 | SQL入門
工藤 | Java中級
吉田 | UNIX基礎
渡辺 | SQL入門
ここから下記のような表を作るとします。行から列にするとします。
name | sql | unix基礎 | java中級
——+—–+———-+———-
渡辺 | ○ | |
工藤 | ○ | | ○
赤井 | ○ | ○ |
鈴木 | ○ | |
吉田 | | ○ |
この場合SQLは下記のようになります。
私の場合集計関数(GROUP BY)とCASE式を使って下記のような式を作りました。これでもできます。
1 2 3 4 5 6 7 8 9 |
SELECT name, CASE WHEN ( SUM(CASE WHEN course = 'SQL入門' THEN 1 ELSE 0 END ) ) = 1 THEN '○' ELSE NULL END AS SQL, CASE WHEN ( SUM(CASE WHEN course = 'UNIX基礎' THEN 1 ELSE 0 END ) ) = 1 THEN '○' ELSE NULL END AS UNIX基礎, CASE WHEN ( SUM(CASE WHEN course = 'Java中級' THEN 1 ELSE 0 END ) ) = 1 THEN '○' ELSE NULL END AS Java中級 FROM courses GROUP BY name |
が下記のようにも書けます。
下記のSQLでnameだけのテーブルを作り、これを通常のcoursesの共通エリアを考えます。
1 |
SELECT DISTINCT name FROM courses |
name
——
渡辺
工藤
赤井
鈴木
吉田
1 2 3 4 5 6 7 8 9 10 11 12 |
SELECT name , ( SELECT '○' FROM courses c1 WHERE c1.name = c0.name AND c1.course = 'SQL入門' ) AS SQL --以下繰り返しなので省略 FROM ( SELECT DISTINCT name FROM courses ) AS c0 |
次は列から行になおします。
下記のようなテーブルがあり、( personnel)下記のようなテーブルをこんどは下記のように2列にするとします。さっきの逆ですね。
employee | child_1 | child_2 | child_3
———-+———+———+———
赤井 | 一郎 | 二郎 | 三郎
工藤 | 春子 | 夏子 |
鈴木 | 夏子 | |
吉田 | | |
employee | child
———-+——-
吉田 |
吉田 |
吉田 |
工藤 |
工藤 | 春子
工藤 | 夏子
赤井 | 一郎
赤井 | 二郎
赤井 | 三郎
鈴木 |
鈴木 |
鈴木 | 夏子
この場合UNIONを使うとかけます。こういう時に使うんですね・・・
1 2 3 4 5 |
SELECT employee, child_1 AS child FROM personnel UNION ALL SELECT employee, child_2 AS child FROM personnel UNION ALL SELECT employee, child_3 AS child FROM personnel |
ちなみにALLを除くと重複行(鈴木 NULLや吉田 NULL)が一行になります。