【ABAP】外部結合(SELECT ~ OUTER JOIN)を3分で解説

ABAP

ABAPのオープンSQL―SELECT文で外部結合を行うテクニックについて解説します

そもそもテーブル結合って何?

外部結合って?内部結合とは何が違うの?

以上のような疑問にお答えします。

このページで学べる内容
  • 前提:テーブル結合とは?
  • 外部結合(OUTER JOIN)とは?―内部結合との違い
  • OUTER JOIN-構文ルール
    • LEFT OUTER JOIN

ABAPerであれば知らないと恥ずかしい基本知識です。是非最後までご覧ください。

本ページはABAPにおけるSELECT文の知識がある方向けの解説ページです。

SELECT文の意味やコーディング方法がイマイチ分かっていない・・・という方は初めに以下のページをご覧ください。

スポンサーリンク

前提:テーブル結合とは?

テーブル結合とは、その名の通りテーブルとテーブルを合体させることを言います。

1つのテーブルだけでは情報が足りないような場合に、別のテーブルから情報を引っ張ってきて別のテーブルを作ってあげるようなイメージです。例えば、上記の例では「役職ID」を基準に、テーブルAとテーブルBを結合しています。

テーブル結合には、内部結合と外部結合。2種類の結合パターンが存在しますが、本ページでは外部結合(OUTER JOIN)について解説しています。

内部結合/外部結合
  • 内部結合:両方のテーブルに存在するデータ同士をくっつける
  • 外部結合:1つのテーブルを基準としてデータをくっつける

外部結合(OUTER JOIN)とは?

外部結合(OUTER JOIN)とは、1つのテーブルを基準として、他のテーブルから情報を引っ張ってくるようなイメージの結合テクニックです。

図で見てみると決して難しくはありませんね。

ここで「結合条件」について、解説しておきます。

外部結合:結合条件

結合条件とは、テーブルAとテーブルBを結合させる条件のこと(何を基準にして2つのテーブルを合体させるか?)です。

例えば、テーブルAとテーブルB両方に存在する「役職ID」を結合条件として2つのテーブルをくっつけてみると、同じ「役職ID」をもつレコード同士が1つのレコードとして合体します。

テーブルA―役職ID = テーブルB―役職ID

では、内部結合とは一体何が違うのでしょうか?

詳しく見ていきましょう。

内部結合との相違点

2つのテーブルを結合させるという意味で両者は同一です。が、以下のような違いがあります。

内部結合

両方のテーブルにレコードが存在する場合にのみ結合が行われる

テーブルBには、役職ID「C」と「D」が存在しないので、テーブル結合が行われません。

外部結合

両方のテーブルにレコードがなくても結合が行われる

テーブルBには、役職ID「C」と「D」が存在しませんが、結合後のテーブルにもちゃんと基準となる全てのレコードが存在しています。

この微妙な違いを理解していないと、思わぬバグが出てきてしまうため、しっかりと学習しておきましょう!

ここからはABAPのSELECT文で外部結合(OUTER JOIN)を行う方法を解説します。

外部結合(SELECT ~ LEFT OUTER JOIN)

SELECT
  (結合テーブルX)~(取得項目),
  (結合テーブルX)~(取得項目),
            …
FROM
  (結合テーブル1)
LEFT OUTER JOIN
  (結合テーブル2)
ON
    (結合テーブル1)~(結合項目) = (結合テーブル2)~(結合項目)
AND (結合テーブル1)~(結合項目) = (結合テーブル2)~(結合項目)
AND (結合テーブル1)~(結合項目) = (結合テーブル2)~(結合項目)
INTO TABLE (内部テーブル名).

結合テーブル1を基準テーブル(左テーブル)とし、結合テーブル2からレコードを引っ張ってくる場合のコードルールです。

外部結合には、「LEFT OUTER JOIN」を利用する方法と、「RIGHT OUTER JOIN」を利用する2つの書き方がありますが、「RIGHT OUTER JOIN」を利用する機会はほとんど存在しないため説明を省略します。

尚、LEFTとRIGHTの違いはどちらのテーブルを基準とするかが異なるだけで、LEFTとRIGHTを入れ替えれば結果は全く同一になります。

外部結合(OUTER JOIN)サンプルコード

SELECT
  CEPC~PRCTR
  CEPC~LOCK_IND
  CEPCT~KTEXT
FROM
  CEPC
LEFT OUTER JOIN
  CEPCT
ON
    CEPCT~SPRAS = SY-LANGU
AND CEPCT~PRCTR = CEPC~PRCTR
AND CEPCT~DATBI = CEPC~DATBI
AND CEPCT~KOKRS = CEPC~KOKRS
    INTO CORRESPONDING FIELDS OF PRS_PRC
WHERE CEPC~PRCTR =  LDF_PRCTR  "利益センタ
  AND CEPC~DATBI >= SY-DATUM.   "有効終了日
SELECT
 BSEG~BELNR,               "取得項目:会計伝票番号
 BSEG~GJAHR,               "取得項目:会計年度
 BSEG~MWSKZ,               "取得項目:税コード
 T007S~TEXT1               "取得項目:税コードテキスト
FROM
  BSEG                      "取得元テーブル:会計伝票明細
LEFT OUTER JOIN
  T007S                            "取得元テーブル:税コード名
ON
    BSEG~MWSKZ  = T007S~MWSKZ     "結合条件:会社コード
AND T007S~KALSM = 'TAXJP'         "結合条件:決定表
INTO TABLE LIT_BSEG_T007S.         "取得項目を格納する内部テーブル

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

SAP / ABAPを1から学習したい方は

SAP / ABAPを1から学習したい初心者の方向けに、できるだけ網羅的にABAPが理解できるよう以下ページに知識体系を整理しています。

特に初心者のうちは、どこから学べばよいか?どう勉強すれば良いか?すらわからない状態になりがち。

ある程度の知識を持ったうえで、はじめて実践的な理解へとつながります。

是非、一度ご覧になってみてください。

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