본문 바로가기

Language/ABAP

[ABAP] SELECT ~ FOR ALL ENTRIES IN <ITAB>

데이터베이스에서 데이터를 SELECT해올 때 INTERNAL TABLE에 있는 데이터와 비교하여 INTERNAL TABLE에 있는 데이터 기준으로 WHERE절 조건이 맞는 데이터만 검색해 온다.

예시 코드

 

이와 같은 방법으로 사용할 수 있는데,

FOR ALL ENTRIES IN 문구를 사용할 때 주의점이 있다.

  • FOR ALL ENTRIES 이후의 인터널 테이블과 INTO 뒤의 테이블은 동일해도 된다.
    테이블의 내용은 FOR ALL ENTRIES로 평가된 이후 INTO 절로 덮어 씌워진다.
  • WHERE의 조건이 인터널테이블의 필드와 비교대상 테이블의 필드타입이 같아야 한다.
  • 인터널테이블의 중복된 값은 하나만 남는다. (DISTINCT)
    필드값이 중복될 경우 자동으로 중복제거되어 원하는 결과를 받아오지 못할 수 있으니 중복되지 않을 키필드를 WHERE절에 꼭 명시해야 한다
  • 인터널테이블에 값이 없다면 모든 데이터를 읽어온다
    사전에 인터널테이블에 값이 있는지 꼭 체크해야 한다
  • 인터널테이블의 수가 많으면 LOOP 수가 증가하므로 쿼리 속도는 느려진다
    키의 기준에 따라 다르지만 약 10만건 정도 되어야 쿼리속도가 느려진다
  • UNION, GROUP BY와 함께 사용할 수 없다
    GROUP BY를 사용해도 GROUP BY를 사용한 결과는 적용할 수 없다

그리고 이걸 따로 공부하면서 SELECT를 하기 전에 인터널테이블을 SORT를 해야 하는가가 쟁점이었다.

이에 대한 자료를 여기저기 찾아봤지만, 어느 블로그 글에서는 SORT를 해야 한다라고 명시되어 있고, 또 다른 블로그 글에서는 명시되어 있지 않았다.

F1 HELP를 찾아보니 인터널테이블을 반드시 SORT 해야 한다는 내용은 없었다.

필요하다 생각되면 SORT를 진행하면 되고, 필요하지 않다고 생각하면 SORT를 안 해도 되는 것 같다.