【ABAP】SELECT文で外部結合―(内部結合との違いは?)

ABAP

連載: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条件として指定することで同じ結果が得られるが、結合条件に指定した方がパフォーマンスが向上することが多いため、サンプルコード内で用いています。

結論

内部結合も、外部結合もその概念さえ覚えてしまえば、難しいものではありません。あれ、ちょっとこれなんだっけ?と思ったら是非またこのページに戻ってきてくださいね。

タイトルとURLをコピーしました