ABAPのオープンSQL―SELECT文の内部結合を行うテクニックについて解説します。
そもそも、内部結合って何?という方でも理解できるよう分かりやすく解説します。
ABAPerを目指す方であれば知らないと恥ずかしい基本知識の1つです。是非最後までご覧ください。
前提:テーブル結合とは?
テーブル結合とは、その名の通りテーブルとテーブルを合体させることを言います。
1つのテーブルだけでは情報が足りないような場合に、別のテーブルから情報を引っ張ってきて別のテーブルを作ってあげるようなイメージです。
テーブル結合には、内部結合と外部結合。2種類の結合パターンが存在しますが、本ページでは内部結合(INNER JOIN)について解説しています。
外部結合について学びたい方は以下のページをご覧ください。
内部結合(INNER JOIN)とは?
内部結合(INNER JOIN)とは、結合条件が両方のテーブルに存在するデータ同士を結合させることを指し示します。
テーブルAとテーブルBを例に解説していきます。
内部結合:結合条件
結合条件とは、テーブルAとテーブルBを結合させる条件のこと(何を基準にして2つのテーブルを合体させるか?)です。
例えば、テーブルAとテーブルB両方に存在する「役職ID」を結合条件として2つのテーブルをくっつけてみると、同じ「役職ID」をもつレコード同士が1つのレコードとして合体します。
テーブルA―役職ID = テーブルB―役職ID
これが内部結合です。
Excel関数に詳しい方であれば、VLOOKUP関数のイメージに近いものが思い浮かんで入れば理解はOKです。
内部結合の注意点
内部結合は冒頭でも解説した通り、両方のテーブルにレコードが存在する場合にのみ結合される結合方法です。
したがって、もし片方のテーブルにしかないレコードが存在すると、以下のようにレコードが欠けた状態で結合されます。
対して、外部結合の場合はレコードが欠けた状態でも無理やり結合が行れるため以下のような形になります。
ここまでの解説を踏まえ、ABAPで内部結合(INNER JOIN)させる方法の解説に移ります。
内部結合(SELECT ~ INNER JOIN)
SELECT (取得したい項目名) (取得したい項目名) ・・・・・ FROM (テーブル) INNER JOIN (テーブル) ON (テーブル)~(項目) = (テーブル)~(項目) INTO TABLE (内部テーブル).
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点解説します。
大量にテーブル結合するとショートダンプが起きやすい
大量なテーブルを一気に結合しようとするとメモリ不足によりショートダンプが発生する場合があります。
だいたい10個以上結合すると危険水域に達してくるので、その場合は事前にビューを作成しておくなど別の方法を検討しましょう。
ビュー(View)とは1つ以上のデータベースから任意のデータを選択して、 見たいデータだけ、欲しいデータだけを表示する仕組みです。
詳しくは以下のページで解説しておりますので合わせてご覧ください。
結合条件に一致する項目が複数あるとレコード重複につながる
結合条件はMECEに指定する必要があります。
もしテーブルBの役職IDがキー項目でないような場合を例にすると、結果は以下のような形になってしまいます。
内部結合は、結合条件にヒットした分だけレコードを格納していく仕組みであるという点を頭に入れておきましょう。
SAP / ABAPを1から学習したい方は
初めてABAPを勉強するのは結構難しいですよね。
でもその悩みを抱えているのは一人じゃありません。全てのABAP使いが同じ道を進んできました。
ABAPをはじめとするプログラミングスキルを武器に、時間と場所に捉われない自由な生き方を目指してみませんか?
読者料典 【完全無料】ABAP:学習カリキュラム ←こちらから!