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

ABAP

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

そもそも、内部結合って何?という方でも理解できるよう分かりやすく解説します。

このページで学べる内容
  • 【前提】テーブル結合とは?
  • 内部結合(INNER JOIN)とは?
    • 外部結合(OUTER JOIN)との違い
  • INNER JOIN-構文ルール
  • INNER JOIN-使用時の注意点・考慮すべき点

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

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

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

スポンサーリンク

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

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

テーブル結合のイメージ

1つのテーブルだけでは情報が足りないような場合に、別のテーブルから情報を引っ張ってきて別のテーブルを作ってあげるようなイメージです。

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

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

内部結合(INNER JOIN)とは?

内部結合(INNER JOIN)とは、結合条件が両方のテーブルに存在するデータ同士を結合させることを指し示します。

テーブルAとテーブルBを例に解説していきます。

内部結合:結合条件

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

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

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

例)内部結合

これが内部結合です。

Excel関数に詳しい方であれば、VLOOKUP関数のイメージに近いものが思い浮かんで入れば理解はOKです。

内部結合の注意点

内部結合は冒頭でも解説した通り、両方のテーブルにレコードが存在する場合にのみ結合される結合方法です。

したがって、もし片方のテーブルにしかないレコードが存在すると、以下のようにレコードが欠けた状態で結合されます。

役職ID「E」が存在しないのでレコードが結合されない

対して、外部結合の場合はレコードが欠けた状態でも無理やり結合が行れるため以下のような形になります。

ここまでの解説を踏まえ、ABAPで内部結合(INNER JOIN)させる方法の解説に移ります。

内部結合(SELECT ~ INNER JOIN)

SELECT
(取得したい項目名)
(取得したい項目名)
  ・・・・・
FROM       (テーブル)
INNER JOIN (テーブル)
      ON   (テーブル)~(項目) = (テーブル)~(項目)
INTO TABLE (内部テーブル).
SELECT文の基本

SELECT文の基本が曖昧な方はまずはこちらのサンプルコードを眺めてみてください。

SELECT(取得したい項目名)
  FROM(テーブル名)
  INTO(構造)/ INTO TABLE (内部テーブル)

SELECT文の基本解説編はこちら。

内部結合を行う場合は、INNER JOINオプションを利用し内部結合するテーブルを指定、ONオプションの後に、結合条件を指定します。

以下にサンプルコードを載せておきます。

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 LT_BSEG_BKPF.        "取得項目を格納する内部テーブル

結合条件を「会社コード」「会計伝票番号」「会計年度」として、BSEG(会計伝票明細)テーブルとBKPF(会計伝票ヘッダ)テーブルを内部結合するサンプルコードです。

分かりやすく言えば、BSEGとBKPFに存在するレコードを、「会社コード」「会計伝票番号」「会計年度」をキーにくっつけているだけです。

尚、内部結合(INNER JOIN)は2つのテーブルだけでなく、3つ4つなど複数のテーブルを一気に結合することも可能です。

SELECT
  KNA1~KUNNR                             "得意先コード
  KNA1~NAME1                             "名称1
FROM
  KNA1
INNER JOIN KNB1
  ON KNA1~KUNNR = KNB1~KUNNR
INNER JOIN ADRC AS C
  ON KNA1~ADRNR = KDRC~ADDRNUMBER
INTO TABLE LT_KNA
WHERE
      KNA1~BUKRS = '1000'                 "会社コード
  AND KNA1~LOEVM = SPACE                  "マスタレコード削除フラグ(共通)
  AND ADRC~DATE_FROM = '2020/12/31'.      "有効開始日付

INNER JOINをあまり使いすぎると、端的に言って読みにくいコードになってしまうのでむやみに使いすぎるのは避けたほうが良いでしょう。

ABAPにおける内部結合(INNER JOIN)の留意点

最後にINNER JOINを使う際のより具体的な注意点を2点解説します。

INNER JOIN利用時に留意しておきたいポイント
  • 大量にテーブル結合するとショートダンプが起きやすい
  • 結合条件に一致する項目が複数あるとレコード重複につながる

大量にテーブル結合するとショートダンプが起きやすい

大量なテーブルを一気に結合しようとするとメモリ不足によりショートダンプが発生する場合があります。

だいたい10個以上結合すると危険水域に達してくるので、その場合は事前にビューを作成しておくなど別の方法を検討しましょう。

ビューとは?

ビュー(View)とは1つ以上のデータベースから任意のデータを選択して、 見たいデータだけ、欲しいデータだけを表示する仕組みです。

詳しくは以下のページで解説しておりますので合わせてご覧ください。

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

結合条件はMECEに指定する必要があります。

もしテーブルBの役職IDがキー項目でないような場合を例にすると、結果は以下のような形になってしまいます。

内部結合は、結合条件にヒットした分だけレコードを格納していく仕組みであるという点を頭に入れておきましょう。

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

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

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

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

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

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