今回は「クエリのマージ」に用意されている6種類の結合方法(左外部/右外部/完全外部/内部/左反/右反)について、それぞれの考え方を紹介していこう。結合方法を間違えると予想外の結果になってしまうので、「どの方法で結合すべきか?」を見極められるように、必ず覚えておく必要がある。
実験用のデータ表(クエリ)
「クエリのマージ」を使ってデータ表を結合するときは、その結合方法に「左外部」または「内部」を指定するのが一般的だ。他の結合方法を使用する機会はあまり多くないが、状況によっては便利に活用できるケースもある。
それ以前の問題として、結合方法をよく理解しないまま「クエリのマージ」を使用するのは少し危なっかしい、ともいえる。この機会に、それぞれの結合方法について理解を深めておくとよいだろう。
ということで、それぞれの結合方法を指定したときに「どのような結果が得られるのか」を実験していこう。まずは、実験用に用意したデータ表を紹介する。
以下の図は、あるハンバーガー店の「4月1日の売上」を集計したデータ表だ。それぞれの「商品ID」ごとに1日の売上金額が記録されている。ちなみに、商品IDが「TODAY」で始まるデータは「本日のお勧め」、「FOOD」で始まるデータは「食べ物」、「DRINK」で始まるデータは「飲み物」となる。
続いては、2つ目のデータ表となる「商品リスト」について紹介していこう。こちらのデータ表には、各IDに対応する「商品名」と「価格」が記録されている。なお、IDが「TODAY」で始まるデータは日替わりメニューになるため、この表には記録されていない。
また、この表には「4月1日の売上」には登場していないIDのデータも記録されている。具体的には、FOOD-005(フライドチキン)、FOOD-006(アップルパイ)、DRINK-004(パインジュース)、DRINK-005(ホットレモン)が「4月1日の売上」に登場しないデータとなる。これらは「一時的に販売を中止している商品」と考えていただきたい。
これら2つのデータ表をそれぞれクエリとして取得し、「4月1日の売上」のクエリを選択した状態で「クエリのマージ」を進めていく。つまり、「4月1日の売上」に「商品リスト」のデータを追加する、という形で結合することになる。
- 操作中のクエリ:「4月1日の売上」
- 追加するクエリ:「商品リスト」
「左外部」で結合した場合
それでは、結合方法による違いを見ていこう。まずは初期値となる「左外部」を選択した場合の例だ。
「クエリのマージ」の設定は以下の図の通り。照合列に指定した「商品ID」と「ID番号」は列名が異なっているが、各列に記録されているデータの内容(意味)が同じであれば問題なく「クエリのマージ」を実行できる。
Tableとして結合されたデータを「すべて展開」すると、以下の図のような結果が得られる。赤枠で囲んだデータが「商品リスト」からピックアップされたデータとなる。
結合結果が見やすくなるように、Excelに出力した例で見ていこう。結合方法に「左外部」を指定した場合は、「操作中のクエリ」に存在していたIDに基づいてデータ表が結合される。つまり、「4月1日の売上」に存在していたIDをもとにデータ表が結合されることになる。
これについては「予想通りの結果」といえるだろう。ただし、データの並び順が変化していることに注意しておく必要がある。「商品リスト」にIDが存在していなかった「TODAY-XXX」のデータは、表の末尾に配置されている。また、これらの行には対応するデータが存在しないため、後半の3列は空白(null)になっている。
「右外部」で結合した場合
続いては、結合方法に「右外部」を選択した場合の例だ。2つのデータ表(クエリ)は先ほどと同じで、結合方法だけを「右外部」に変更している。
この結果は以下の図のようになる。こちらもExcelに出力した例で見ていこう。結合方法に「右外部」を指定した場合は、「追加するクエリ」に存在していたIDに基づいてデータ表が結合される。つまり、「商品リスト」に存在していたIDをもとにデータ表が結合されることになる。
「商品リスト」には「TODAY-XXX」のIDが存在していなかったため、これらの行は除外されている。その一方で、「商品リスト」にだけ存在していた「FOOD-005」や「FOOD-006」、「DRINK-004」、「DRINK-005」といった行が追加されている。これらのIDに対応する「4月1日の売上」のデータはないため、これらのセルは空白(null)として扱われる。
「完全外部」で結合した場合
続いては、結合方法に「完全外部」を選択した場合の例だ。こちらも結合方法だけを「完全外部」に変更した例となる。
結合方法に「完全外部」を指定した場合は、「操作中のクエリ」または「追加するクエリ」に存在していたIDに基づいてデータ表が結合される。つまり、「すべてのID」についてデータ表が結合されることになる。
当然ながら、対応するデータが存在しない箇所がいくつか生じることになる。これらのセルは空白(null)として扱われる。
「内部」で結合した場合
続いては、結合方法に「内部」を選択した場合の例だ。こちらは前回の連載でも紹介した結合方法となる。
結合方法に「内部」を指定した場合は、「操作中のクエリ」と「追加するクエリ」の両方に存在していたIDに基づいてデータ表が結合される。つまり、「重複(共通)しているID」についてのみ、データ表が結合されることになる。
このため、「4月1日の売上」だけに存在していた「TODAY-XXX」の行を除外した結合結果になっている。
「左反」で結合した場合
続いては、結合方法に「左反」を選択した場合の例だ。
結合方法に「左反」を指定した場合は、「操作中のクエリ」だけに存在していたIDに基づいてデータ表が結合される。つまり、「4月1日の売上」には有る、「商品リスト」には無い、というIDだけが抽出されることになる。
この場合、各IDに対応する「商品リスト」のデータは皆無になるので、追加された列のデータもすべて空白(null)になる。このため、「データ表の結合」というより「データの抽出機能」といった意味合いが強くなる。
「追加するクエリ」に存在するデータを「操作中のクエリ」から削除する、という目的で使用するのが一般的だ。もっとわかりやすく表現すると、「操作中のクエリ」-「追加するクエリ」という引き算のような処理になる。
「右反」で結合した場合
最後に、結合方法に「右反」を選択した場合の例だ。こちらは、「左反」とは逆の処理になる。
結合方法に「右反」を指定した場合は、「追加するクエリ」だけに存在していたIDに基づいてデータ表が結合される。つまり、「4月1日の売上」には無い、「商品リスト」には有る、というIDだけが抽出されることになる。
先ほどと同様に表現すると、「追加するクエリ」-「操作中のクエリ」という引き算のような処理になる。
「結合の種類」の考え方
ということで、6種類の結合方法について足早に解説してきたが、少し頭が混乱している方もいるだろう。「左外部」や「右反」など、用語が一般的でないことも理解を妨げる原因になっていると思われる。
そこで、理解を助けるイメージ図を紹介しておこう。以下の図において、左側の円は「操作中のクエリ」、右側の円は「追加するクエリ」を示している。そして、緑色で塗りつぶした部分が「結合結果として得られる部分」と考えて頂きたい。
このように考えると、用語と結合方法の関係を理解しやすくなるだろう。要するに、
- 左=操作中のクエリ
- 右=追加するクエリ
と考えればよい訳だ。上図を覚えておけば、「どのデータ(行)が残り、どのデータ(行)が除外されるのか」をイメージしやすくなるはずだ。
多少の慣れは必要であるが、これで「クエリのマージ」について深く理解できるようになると思われる。時間に余裕がある方は、実験用のデータ表を2つ用意して実際に試してみるとよいだろう。
結合方法の違いを理解すると、「クエリのマージ」を色々な用途に応用できるようになる。2つのデータ表を「結合」するときだけでなく、2つのデータ表の「差分」を求めるときにも「クエリのマージを活用できる」ということを実感できるだろう。