Access学習メモ 7-9. SQL基礎学習⑨

Access学習メモ 7-9. SQL基礎学習⑨

コンテンツ
学び
右外部結合(RIGHT JOIN)SQLをつくらないといけないパターン

複数テーブルを用いてSQLを構成する際に用いる結合(JOIN)方法には、
内部結合と(左/右)外部結合がある。

【内部結合(INNER JOIN)】
結合相手となるレコードが存在しない(またはNullである)場合
結合を中止しお互いのテーブル(レコード)は非表示となる。
【外部結合(LEFT JOIN/RIGHT JOIN)】
結合先テーブルに一致するレコードがなくても(Nullでも)
お互いのテーブル(レコード)を必ず表示する。

【注意点】
内部結合/外部結合の対応差によって影響を受けるのは
「レコード(行)が表示されるか、されないか」であり
設計したフィールド(レコードの見出し)自体は
データの有無に応じて消失することはない。

【今回のテーマ】
右外部結合(RIGHT JOIN)の必要性
クエリのデザインビュー画面でテーブル間に結合線を引き
JOIN(結合)させる際
テーブル置き順、或いは結合線(矢印)の引く際のドラッグの方向によっては
画面上の配置と、Accessが認識する「左右」が逆転するケースがある。
プロパティ①.jpg

プロパティ②.jpg

Accessの「結合プロパティ」における左右は
「画面上の見た目の位置」ではなく
「結合線を引いた順番やAccess側の内部順序」で決まることがあり、
「左外部結合にしたいから2番(左の全レコード)を選ぼう」
と機械的に選ぶと失敗する。

外部結合を選ぶ場合、左右どちらを主フィールドとするかは
画面上の左右ではなく、ダイアログ内の具体的な説明文で判断しないと危険!

第1段階のJOIN(結合プロパティ)
上から2番め: M_登場人物の全レコードを表示する設定
上から3番め: M_配信リストの全レコードを表示する設定
「配信リストを主役にして、登場人物の登録がなくても表示したい」場合
今回は 「3番め:RIGHT JOIN」を選択するのが正解。
結合プロパティ①.jpg

第2段階のJOIN(結合プロパティ)
上から2番め: M_名簿の全レコードを表示する設定
上から3番め: M_登場人物の全レコードを表示する設定
「登場人物を主役にして、名簿に登録がなくても表示したい」場合
今回は 「3番め:RIGHT JOIN」を選択するのが正解。
結合プロパティ②.jpg

【右外部結合(RIGHT JOIN)】
例:左外部結合と同条件
それぞれの放送話に登場するキャラクター名を記録していく。
ただし、114話のうち、「M_登場人物」にデータがあるのは70話まで。
また、71話めのゴジNoとして、「ココナラ」とダミー情報が混在。
もちろん、「M_名簿」にはそのようなキャラクター登録はない。
右外部結合にて、左外部結合と同じ結果を表示するには?

LEFT JOINをRIGHT JOINに置き換える。
FROM句のテーブルや()位置を逆転させる。

SELECT
  M_配信リスト.[話数], 
  M_配信リスト.[タイトル], 
  M_登場人物.[ゴジNo], 
  M_名簿.[キャラクター名]
FROM 
  M_名簿 
RIGHT JOIN 
  (M_登場人物 RIGHT JOIN M_配信リスト ON M_登場人物.[話数] = M_配信リスト.[話数]) 
ON 
  M_名簿.[ゴジNo] = M_登場人物.[ゴジNo];

SELECT句(表示するもの):
M_配信リスト からは「話数」と「タイトル」
配信.jpg
配信2.jpg
配信3.jpg
配信4.jpg

M_登場人物 からは「ゴジNo」(中継地点のデータ)
登場人物.jpg

M_名簿 からは「キャラクター名」
名簿.jpg

FROM句とRIGHT JOIN(繋ぎかたと条件):
①FROM
M_名簿 RIGHT JOIN 
(M_登場人物 RIGHT JOIN M_配信リスト ON 条件) 
意味:名簿(および登場人物と配信リスト)を繋ぐ
※文法上、優先すべきふたつの結合を先に宣言する必要があり
 JOIN句が①に集約され構文全体のバランスが不自然。
②ON 条件;
意味:登場人物と名簿の繋ぎは [ゴジNo] で。

3つ以上のテーブルを繋ぐ場合
()を用いて、Accessに結合の順序を明示する。
RIGHT JOINでは「主役」を一番右、かつ()内の右に配置するのが掟。
①()内RIGHT JOINの結合を優先し
②①の塊に次のRIGHT JOINを繋げる。
LEFT JOINの考え方と同じ。

RIGHT JOIN
M_配信リスト ON M_登場人物.[話数] = M_配信リスト.[話数]
第1ステージ: M_登場人物 (従) と M_配信リスト (主)
「放送回」を全表示

①のON 条件
条件: M_登場人物.[話数] = M_配信リスト.[話数]
意味:
(Accessから見た)左テーブルM_登場人物.[話数]と
右テーブルM_配信リスト.[話数]が一致したレコード同士を横に並べてね

RIGHT JOIN を使うことで
登場人物が登録されていない放送回の話数であっても
リストから消えることなくすべて表示。

RIGHT JOIN
ON M_名簿.[ゴジNo] = M_登場人物.[ゴジNo]
第2ステージ: M_名簿 (従) と M_登場人物 (主)
※第1ステージで残った「放送回に出たキャラ情報」を主役とし
名簿データ有無を確認

②のON 条件
条件: M_名簿.[ゴジNo] = M_登場人物.[ゴジNo]
意味:
(Accessから見た)左テーブルM_名簿[ゴジNo]と
右テーブルM_登場人物[ゴジNo]が一致したレコード同士を横に並べてね

「条件が揃ったレコードのみ」表示される内部結合(INNER JOIN)に対し
左外部結合(LEFT JOIN)は、データが一致しなくても存在しなくても
表示を継続するための設定であり
右外部結合(RIGHT JOIN)も考え方は同じだが
「右側を全表示する」ルールを3つのテーブルに適用するためには
SQL計算上も「名簿 → 登場人物 → 配信リスト」の順序で
右へ繋いでいく必要がある。

予想される結果(右外部結合): 
すべてのテーブルを右外部結合(RIGHT JOIN))で繋いでいるため、主役である「M_配信リスト」にあるすべてのレコードを表示。
 「登場人物が登録されていない」あるいは「名簿情報が存在しない」という場合でも、レコード(行)そのものが消滅することはない。不一致な部分は Null(空欄)として処理され、結果として全放送回を網羅したリストが得られる。

【結果】
ゴジNo登録が70話めまでなのは学習メモ7-7と不変だが、話数登録のある全114話のレコード情報が表示された。
また、71話のゴジNoとして、名簿に登録のない「ココナラ」というレコード情報が消えずに反映されている。

【実務における利点】
左外部結合と同じく、条件不一致や誤記の発見に役立つ。
クエリ作成過程で左右が逆転してしまっても「結合プロパティ」にて主役となるテーブルが左右どちらかを検討し、
右外部結合を選択することで、テーブルや矢印の向きを編集しなくても左外部結合と同じ効果を持たせることが可能。

【補足】
話数毎にゴジNoを昇順表記させたいときはORDER BY句が必要になります。

SELECT
  M_配信リスト.[話数], 
  M_配信リスト.[タイトル], 
  M_登場人物.[ゴジNo], 
  M_名簿.[キャラクター名]
FROM
  M_名簿 
  RIGHT JOIN (M_登場人物 
  RIGHT JOIN M_配信リスト ON M_登場人物.[話数] = M_配信リスト.[話数]) 
  ON M_名簿.[ゴジNo] = M_登場人物.[ゴジNo]
ORDER BY
  M_配信リスト.[話数] ASC, 
  M_登場人物.[ゴジNo] ASC;








サービス数40万件のスキルマーケット、あなたにぴったりのサービスを探す