ABAP

【ABAP】内部結合(INNER JOIN)の3つのポイント

ABAPのオープンSQL―SELECT文を用いて内部結合を行う方法について解説します

  • ページ前半 ⇒ 内部結合とは?をざっくり解説
  • ページ後半 ⇒ コーディングする際の勘所と注意点

の順番で解説しています。なんとなく中身が分かっている方は、ページ後半から読んでいただいても良いかもしれません。ページ後半では実際のサンプルコードを用いながら解説しております。

「そもそもSELECT文って?」という方向けに、SELECT-SINGLEについて解説したページのリンクを貼っておきます。

それでは早速解説を始めます。

そもそも:テーブル結合とは?

まず大前提となる知識の解説です。

結論から言うと「テーブル結合」とは、言葉そのままにテーブルとテーブルを繋げることを言います。

※「テーブル」についてイメージがわかない方は、こちら「内部テーブル/構造/変数―ABAPの3つの基本」。

全く理解が無い方にとって、イメージがつくようでつかないのがテーブル結合ですが、この記事ではテーブルのイメージ図を利用して説明していきます。今は「なんとなく」結合は「テーブルとテーブルの合体なんだなあ」と理解しておいてください。

内部結合(INNER JOIN)とは?

内部結合は、結合条件が両テーブルいずれも存在する場合に利用する結合方法」です。どういうことか、以下の例(イメージ図)を見て、理解を深めましょう。

ここに「生徒名簿」テーブルと「中間テスト」テーブルがあります。それぞれのテーブルに共通して「出席番号」がありますが、それ以外の項目は別です。

この状態では、だれがどの点数を取っているのかよくわからないですよね。ここで、2つのテーブルを 両方のテーブルに共通して存在する「出席番号」を基準に 結合してみましょう。

内部結合の結果

実はこれが内部結合です。冒頭で「 内部結合は、結合条件が両テーブルいずれも存在する場合に利用する結合方法 」と説明しましたが、その通り両方のテーブルに存在する「出席番号」をキーにつなぎ合わせて、1つのテーブルを作り上げています。

内部結合―結合条件とは?

ここで、内部結合を用いる際に覚えておかなくてはならない用語―。「結合条件」について解説します。

結合条件とは、テーブル同士を繋げる条件式のことです。先ほどの例では、

「生徒名簿」―出席番号=「中間テスト点数」―出席番号

というのが結合条件になります。” 両方のテーブルにある「出席番号」という項目をキーにつなぎ合わせ “ というのは「結合条件」を指定した、ということです。

内部結合は、両方のテーブルからそれぞれの出席番号が一致するようにテーブルを結合させることである、と理解しておきましょう。

内部結合の注意点(罠)

ここまでの解説を読んで頂いた人の中には

あれ? 内部結合めっちゃ簡単じゃね・・・?

って思っている人も多いことでしょう。

確かに、そんなに難しい話ではないのですが、内部結合には罠があります。

ここでは、内部結合の罠について解説していきます。早速ですが、先ほどのテーブルが、以下のような状態を考えてみます。

出席番号記入漏れした生徒がいたために、「中間テスト点数」テーブルの「出席番号」が抜け落ちています。

さて、この場合出席番号を結合条件とした場合、どうなるか?

答えは「結合されずに終わる」です。

したがって出来上がったテーブルは以下になります。

ご覧のように出席番号の2~3のレコードがありません

内部結合を行う際は、結合条件とする項目の値が両方のテーブルに存在する場合にのみ有効な方法です。

この罠を踏まえて、最初に説明した内部結合の結論を再度読み返してみましょう。

結論から言うと「内部結合は、結合条件が両テーブルいずれも存在する場合に利用する結合方法」です。

これで、結論の意味が分かったはずです。

概念を理解したところで実際のABAPのコーディングを見ていきましょう。

内部結合(INNER JOIN)―SELECT文

コードルール:INNER JOIN

SELECT  (テーブル)~(項目),
  (テーブル)~(項目),

  FROM (テーブル)
  INNER JOIN (テーブル)
ON (テーブル)~(項目) = (テーブル)~(項目)
  INTO TABLE (ワークエリア)

内部結合に関する部分を青文字にしています。

内部結合を行う際の注意点は以下の2つだけです。

 ①「INNER JOIN句」で内部結合するテーブルを指定する。

 ②「ON」の後に、結合条件を指定する。

例えばテーブルを2つ、3つと増やしたい場合は、再度「INNER JOIN」を繰り返します。内部結合の基本理解があれば難しい構文ではありません。

※SELECT文の基本的なルールは下記ページを参照ください。

サンプルコード(INNER JOIN)

SELECT   BKPF~BELNR,                   "取得項目:会計伝票番号         BKPF~GJAHR,                   "取得項目:会計年度
	 BKPF~BLART,                   "取得項目:伝票タイプ
	 BSEG~SAKNR                    "取得項目:G/L 勘定コード
FROM BKPF                              "取得元テーブル:会計伝票ヘッダ
INNER JOIN BSEG                        "取得元テーブル:会計伝票明細
	 ON  BKPF~BUKRS = BSEG~BUKRS   "結合条件:会社コード
	 AND BKPF~BELNR = BSEG~BELNR   "結合条件:会計伝票番号
	 AND BKPF~GJAHR = BSEG~GJAHR   "結合条件:会計年度
INTO TABLE @DATA(LIT_BSEG_BKPF).       "取得項目を格納する内部テーブル

サンプルコードの解説

このSELECT文では、BKPF(会計伝票ヘッダ)テーブルとBSEG(会計伝票明細)テーブルの内部結合を実施しています。

最終的に拾ってきたい項目は、

① BKPFの会計伝票番号
② BKPFの会計年度
③ BKPFの伝票タイプ
④ BSEGの勘定コード

の4つです。

ただし、SELECT文で扱えるテーブルは1つ(FROM句に指定するテーブルは1つのみである)のため、BKPFとBSEGを結合する必要があるということです。

結合条件については、INNER JOIN句で指定します。

もし、その結合条件に指定された項目の値が、二つのテーブルに同時に存在していなければ内部結合は行われず、INTO句で指定したテーブルには格納されません。

※INTO句の@DATAについては、こちらを参照ください。SAPのバージョンによっては動作しない構文です。

内部結合(INNER JOIN)を使う際のポイント3つ

内部結合を利用する際には、必ず以下で解説する内容を頭に入れておく必要があります。

繰り返しの内容もありますが、ここを押さえておくとシステム調査をする際などに役に立ちますので、覚えておいてください。

結合条件が両テーブルいずれも存在する場合のみ有効

なんども補足なりますが、レコードが片方のテーブルにしかなかった場合データが取得できない為、テーブル結合する際は内部結合なのか別途説明する外部結合かをよく検討することが必要です。

大量にテーブル結合するとメモリ不足でショートダンプする

テーブルを結合する際、そのテーブルはプログラムロード時にメモリに格納することになります。

したがって、そのテーブルが多くなればなるほどショートダンプする可能性が高まります。

だいたい10個以上結合すると危険水域に達してくるので、下記ページで説明しているビューの活用を検討したほうがよいでしょう。

結合条件に一致する項目が複数あるとレコード重複につながる

ここまでの解説では、結合条件を「出席番号」としていました。

(再掲)生徒名簿テーブル

もし上記のテーブルに、同じ出席番号が存在したらどうなると思いますか?

正解は、レコードが重複することになります。

テーブルAのaという項目とテーブルBのbという項目を結合条件にした際に、bが2つ以上存在ヒットする場合は、ヒットした分全てを結合します。

内部結合と外部結合の相違点について

これで内部結合についての理解はOKです。(実際のコーディングができるはずです。)

内部結合を知っていれば、合わせて外部結合についても理解しておきましょう。

以下のページは、外部結合について解説しつつ、内部結合と外部結合の違いについて詳しく説明していますので、お時間があれば続けてお読みください。