ABAP SQL マスタデータ検索時の存在チェックの方法

  SQL

概要

SQLでマスタデータの存在チェックを行いたい場合にCOUNT命令を使うのは控えるようにしよう。
COUNT命令を使用した場合は全件スキャンしてしまうので件数が多いとパフォーマンスが悪くなってしまう。
SELECT SINGLEやSELECTでUP TO 1 ROWSを使用する方が良いだろう。

サンプルコード:悪い例

DATA: CNT TYPE I.
CLEAR: CNT.
SELECT COUNT(*) FROM MARC INTO CNT
 WHERE WERKS = 'XXXX'.
IF CNT > 0.
  WRITE: 'レコードあり'.
ELSE.
  WRITE: 'レコードなし'.
ENDIF.

サンプルコード:良い例1

DATA: V_MATNR type MATNR.
SELECT SINGLE MATNR INTO V_MATNR FROM MARC
 WHERE WERKS = 'XXXX'.
IF SY-SUBRC = 0.
  WRITE: 'レコードあり'.
ELSE.
  WRITE: 'レコードなし'.
ENDIF.

サンプルコード:良い例2

DATA: V_MATNR type MATNR.
SELECT MATNR INTO V_MATNR FROM MARC
    UP TO 1 ROWS
 WHERE WERKS = 'XXXX'.
ENDSELECT.
IF SY-SUBRC = 0.
  WRITE: 'レコードあり'.
ELSE.
  WRITE: 'レコードなし'.
ENDIF.

説明

悪い例で記載したのが、COUNT文を使用した方法である。レコード件数が少ない場合はこのような
方法でも特に問題はないが、件数が増えればそれだけパフォーマンスの劣化につながる。
どうしても件数が必要な場合以外は、COUNT文を使用するのは控えた方が良いだろう。
良い例1、良い例2で記載したのが、1件だけレコードを取得する方法だ。存在チェックであれば
1件でもあれば以降のデータを件数する必要はない為、このような方法で問題ない。
SELECT SINGLEを使用するか、SELECTのUP TO 1 ROWSを使用するかは判断が難しいが
条件に主キーを使用できるならSELECT SINGLE、それ以外はSELECTのUP TO 1 ROWSで問題ないのではないだろうか。