連載:ABAPで書くSQL構文
本ページでは、ABAPにおけるオープンSQLをコーディングする際に知っておくべき基本概念である「外部結合」についての解説ページです。
内部結合を知っていることが前提となるため、もし内部結合の概念がなければ、以下のページをお読みになってから、本ページに戻ってきてください。
外部結合とは?
関連する複数のテーブルからデータを取得したい場合に利用するテーブル結合の一種です。基本的な考え方は、おおよそ内部結合と一緒ですが復習も兼ねて説明します。以下のテーブル(イメージ)は、内部結合でも用いた2つのテーブルです。

生徒名簿テーブルから「全項目」を、中間テスト点数テーブルからは「英語の点数」項目を取得し1つのテーブルを作った状態でデータ取得したい。そんな時に利用するのが、外部結合です。外部結合を用いることで、下記のようなテーブル(※「生徒氏名別英語の点数」テーブル)を作成することができます。

内部結合との相違点
2つのテーブルを結合させるという意味で両者は同一です。異なるのは「結合条件に値がない」場合の処理の仕方です。結合条件の値がない場合に、内部結合が「当該レコードの結合不可」となるのに対し、外部結合は「当該レコードを強制的に結合」します。
とういうことか見ていきましょう。
先ほどのテーブルの例で、中間テスト点数テーブルから出席番号が欠落している状態を考えます。

さて、このとき結合条件を出席番号とした場合どうなるでしょうか?まず、おさらいがてら、内部結合の場合を考えてみましょう。内部結合の場合、結合条件が両テーブルに存在する場合のみ有効なので、以下のテーブルが出来上がります。

つまり、出席番号が欠落しているレコードは無視することで結合が実現されます。その上で、外部結合を用いた場合に出来上がるのテーブルを見てみましょう。以下のテーブルが答えです。

つまり、強制的に結合させるが「分からないものは空白として結合」することでテーブル結合を実現するのです。これが、外部結合です。
外部結合のSELECT文
コードルール
SELECT (結合テーブルX)~(取得項目),
(結合テーブルX)~(取得項目),
…
FROM (結合テーブル1)
LEFT OUTER JOIN (結合テーブル2)
ON(結合テーブル1)~(結合項目) = (結合テーブル2)~(結合項目)
AND (結合テーブル1)~(結合項目) = (結合テーブル2)~(結合項目)
AND (結合テーブル1)~(結合項目) = (結合テーブル2)~(結合項目)
LEFT OUTER JOIN (結合テーブル3)
ON (結合テーブル1)~(結合項目) = (結合テーブル3)~(結合項目)
AND (結合テーブル1)~(結合項目) = (結合テーブル3)~(結合項目)
AND (結合テーブル1)~(結合項目) = (結合テーブル3)~(結合項目)
…
INTO TABLE @DATA(内部テーブル名).
外部結合に関する部分だけ青字で強調しています。SELECT文の基本構文ルールは、以下のページをご覧ください。
サンプルコード
SELECT
BSEG~BELNR, "取得項目:会計伝票番号
BSEG~GJAHR, "取得項目:会計年度
BSEG~MWSKZ, "取得項目:税コード
T007S~TEXT1 "取得項目:税コードテキスト
FROM BSEG "取得元テーブル:会計伝票明細
LEFT OUTER JOIN T007S "取得元テーブル:税コード名
ON BSEG~MWSKZ = T007S~MWSKZ "結合条件:会社コード
AND T007S~SPRAS = @SY-LANGU "結合条件:言語(※1)
AND T007S~KALSM = 'TAXJP' "結合条件:決定表(※1)
INTO TABLE @DATA(LIT_BSEG_T007S). "取得項目を格納する内部テーブル
サンプルコードの解説
① 最終的に取得したい項目 ⇒ 2行目~5行目
② テーブル「BSEG」を基準にテーブル「T0075」を結合する命令 ⇒ 6行目
③ 結合条件を指定 ⇒ 7行目~9行目
やっていることはこれだけ。会計伝票の明細(BSEG)と、それに紐づく税コード名(T007S)を結合し、BSEGのレコードを母数として、合致する税コード名称を付与できる会計伝票の税コード(BSEG-MWSKZ)に紐づく税コードテキスト(T007S-TEXT1)を取得したい。でも会計伝票で税コードを持たない場合もあるから、内部結合するとそのレコードが欠落する…
といった場合に外部結合すると、片方のテーブルレコードを母数にして、もう片方の項目を結合可能となる例です。
オプション
結合条件はテーブルの項目同士をつなぐだけでなく、サンプルコード内(※1)のように片方のテーブルの絞り込み条件を指定することも可能です。WHERE条件として指定することで同じ結果が得られるが、結合条件に指定した方がパフォーマンスが向上することが多いため、サンプルコード内で用いています。
結論
内部結合も、外部結合もその概念さえ覚えてしまえば、難しいものではありません。あれ、ちょっとこれなんだっけ?と思ったら是非またこのページに戻ってきてくださいね。