左外部結合(LEFT JOIN)SQLをつくる
複数テーブルを用いてSQLを構成する際に用いる結合(JOIN)方法には、
内部結合と(左/右)外部結合がある。
【内部結合(INNER JOIN)】
結合相手となるレコードが存在しない(またはNullである)場合
結合を中止しお互いのテーブル(レコード)は非表示となる。
【外部結合(LEFT JOIN/RIGHT JOIN)】
結合先テーブルに一致するレコードがなくても(Nullでも)
お互いのテーブル(レコード)を必ず表示する。
【注意点】
内部結合/外部結合の対応差によって影響を受けるのは
「レコード(行)が表示されるか、されないか」であり
設計したフィールド(レコードの見出し)自体は
データの有無に応じて消失することはない。
【今回のテーマ】
現時点における全放送話リストの記録状況を出力し、
未記入や条件不適合のレコード情報をチェックする。
(「M_配信リスト」の話数に「M_登場人物」、
「M_登場人物」のゴジNoに「M_名簿」を繋ぎ、リストを見える化。)
【左外部結合(LEFT JOIN)】
【例】
それぞれの放送話に登場するキャラクター名を記録していく。
ただし、114話のうち、「M_登場人物」にデータがあるのは70話まで。
また、71話めのゴジNoとして、「ココナラ」とダミー情報が混在。
もちろん、「M_名簿」にはそのようなキャラクター登録はない。
左外部結合の結果、データはどのように表示されるか?
SELECT
M_配信リスト.[話数],
M_配信リスト.[タイトル],
M_登場人物.[ゴジNo],
M_名簿.[キャラクター名]
FROM
(M_配信リスト
LEFT JOIN M_登場人物 ON M_配信リスト.[話数] = M_登場人物.[話数])
LEFT JOIN M_名簿 ON M_登場人物.[ゴジNo] = M_名簿.[ゴジNo];
SELECT句(表示するもの):
M_配信リスト からは「話数」と「タイトル」
M_登場人物 からは「ゴジNo」(中継地点のデータ)
M_名簿 からは「キャラクター名」
FROM句とLEFT JOIN(繋ぎかたと条件):
①FROM (M_配信リスト LEFT JOIN M_登場人物 ON 条件)
②LEFT JOIN M_名簿 ON 条件;
3つ以上のテーブルを繋ぐ場合()を用いて、Accessに結合順序を明示。
①()内LEFT JOINの結合を優先し
②①の塊に次のLEFT JOINを繋げる。
()内から計算を始めるのは、算数の考え方と同じか。
☆LEFT JOIN①
M_登場人物 ON M_配信リスト.[話数] = M_登場人物.[話数])
第1ステージ: M_配信リスト (主) と M_登場人物 (従)
「話数(放送回)」を全表示
①のON 条件
条件:M_配信リスト.[話数] = M_登場人物.[話数]
意味:
左テーブルM_配信リスト.[話数]と、右テーブルM_登場人物.[話数]が一致したレコード同士を横に並べてね。
LEFT JOINを使うことで、登場人物が登録されない放送回の話数であっても
リストから消えることなくすべて表示。
☆LEFT JOIN②
M_名簿 ON M_登場人物.[ゴジNo] = M_名簿.[ゴジNo]
第2ステージ: M_登場人物 (主) と M_名簿 (従)
※第1ステージで残った「放送回の登場人物」を全表示
②のON 条件
条件: M_登場人物.[ゴジNo] = M_名簿.[ゴジNo]
意味:
左テーブルM_登場人物.[ゴジNo]と、右テーブルM_名簿.[ゴジNo]が一致したレコード同士を横に並べてね。
前段①LEFT JOIN _登場人物 ON M_配信リスト.[話数] = M_登場人物.[話数]) ...の結果に対し
さらに「M_名簿」からキャラクターの詳細情報(名前など)を結合。
再びLEFT JOINを使うことで、名簿に未登録のキャラクターがいたとしても
その放送回やゴジNoの情報は維持されたまま、名前が Null(空欄)表示。
「条件が揃ったレコードのみ」表示される内部結合(INNER JOIN)に対し
左外部結合(LEFT JOIN)は、データが一致しなくても存在しなくても表示を維持するための設定といえる。
予想される結果(左外部結合):
すべてのテーブルを左外部結合(LEFT JOIN)で繋いでいるため
「M_配信リスト」および「 M_登場人物」にあるすべてのレコードを表示。
「登場人物が登録されていない」あるいは「名簿に存在しない」場合でも、レコード(行)そのものが消滅することはなく、全放送回を網羅したリストが得られる。
【結果】
ゴジNo登録が70話めまでなのは学習メモ7-7と不変だが、
「話数」登録のある全114話のレコード情報が表示された。
また、71話めのゴジNoとして、名簿に登録のない「ココナラ」レコード情報が消えずに反映されている。
【実務における利点】
条件不一致や誤記の発見に役立つ。
内部結合の場合、条件不一致のレコード情報は最初から「存在しないもの」として隠されてしまう。
左外部結合を用いることで、本来そこにあるかも知れない情報や不整合を浮き彫りにできる。