[ABAP] OPEN SQL 데이터 읽기 - FOR ALL ENTRIES, GROUPING, SORT, SUBQUERY


🌝 OPEN SQL : 데이터 읽기 - WHERE



🌜 FOR ALL ENTRIES


  • 인터널 테이블과 데이터 베이스 테이블을 JOIN 하는 개념과 유사

  • LOOP를 수행하면서 SQL 수행

  • !!FOR ALL ENTRIES 구문 사용 시 주의사항!!

    • 인터널 테이블의 컬럼과 비교 대상 테이블의 컬럼 타입은 같아야 함

    • LIKE, BETWEEN, IN과 같은 비교 구문 사용 불가

    • Unique Key 기준, 인터널 테이블의 중복된 값은 하나만 남음

    • 인터널 테이블이 NULL이면 모든 데이터를 읽어옴 -> 빈 값인지 꼭 체크해야 함!

    • 인터널 테이블의 수가 많으면 LOOP 수가 증가하므로 SELECT 속도가 줄어듦

  • ex)

      REPORT ZTEST.
    
      DATA gt_spfli TYPE TABLE OF spfli.
      DATA gt_sflight TYPE TABLE OF sflight.
      DATA gs_sflight TYPE sflight.
    
      SELECT * FROM spfli
      INTO TABLE gt_spfli.
    
      SELECT * FROM sflight
          INTO TABLE gt_sflight
          FOR ALL ENTRIES IN gt_spfli
          WHERE carrid = gt_spfli-carrid
          AND connid = gt_spfli-connid.
    
      LOOP AT gt_sflight INTO gs_sflight.
          WRITE : / gs_sflight-carrid, gs_sflight-connid.
      ENDLOOP.
    



🌝 OPEN SQL : 데이터 읽기 - GROUPING


GROUP BY / HAVING

  • AGGREGATE 함수를 사용하기 위해서는 SELECT 구문에 GROUP BY를 사용해야 함

    • AGGREGATE 함수 종류 : AVG(평균) / COUNT(개수) / MAX(최댓값) / MIN(최솟값) / STDDEV(표준편차) / SUM(합계) / VARIANCE(분산)



🌝 OPEN SQL : 데이터 읽기 - SORT


ORDER BY ASCENDING / DESCENDING

  • ORDER BY PRIMARY KEY

    • 테이블의 KEY에 의해 정렬

    • SELECT * 구문에만 사용 가능

    • JOIN 구문 및 VIEW에는 사용할 수 없음

  • ex)

      REPORT ZTEST.
    
      DATA : gt_itab TYPE STANDARD TABLE OF sflight,
          gs_wa TYPE sflight.
    
      SELECT * INTO TABLE gt_itab
          FROM sflight
          UP TO 10 ROWS
          WHERE carrid EQ 'AA'
          ORDER BY CONNID DESCENDING FLDATE DESCENDING.
    
      LOOP AT gt_itab INTO gs_wa.
       WRITE : / '항공사코드 : ', gs_wa-carrid, '/ 연결번호 : ', gs_wa-connid, ' / 항공편일자 : ', gs_wa-fldate.
      ENDLOOP. 
    



🌝 OPEN SQL : 데이터 읽기 - SUBQUERY


SELECT 구문의 WHERE 조건에 또 다른 SELECT 구문을 추가 해 값을 제한하는 목적으로 사용


🌜 Scalar Subquery


  • SELECT절 안에 기술된 SELECT절, JOIN 구문과 유사한 역할 수행

  • Scalar Subquery의 특징

    • 반드시 한 컬럼만을 반환해야 함

    • Nested Loop 방식으로 처리됨

    • Scalar Subquery가 실행되는 횟수 = row 수

    • 반복되는 코드나 마스터 유형의 테이블을 조회하는 경우 사용하면 효율적

  • ex)

      REPORT ZTEST.
    
      DATA : gv_carrid TYPE sflight-carrid,
          gv_connid TYPE sflight-connid,
          gv_paymentsum TYPE sflight-paymentsum.
    
      SELECT SINGLE carrid connid paymentsum
          INTO (gv_carrid, gv_connid, gv_paymentsum)
          FROM sflight AS a
          WHERE carrid IN (SELECT carrid
                          FROM spfli
                          WHERE carrid = a~carrid
                          AND connid = a~connid)
          AND a~carrid = 'AA'.
        
      WRITE : gv_carrid,  gv_connid, gv_paymentsum.
    


🌜 Non-Scalar Subquery


  • Subquery의 결과가 존재하면 TRUE를, 존재하지 않으면 FALSE를 반환

  • EXISTS 구문을 이용해 구현

  • ex)

      REPORT ZTEST.
    
      DATA : gv_carrid TYPE sflight-carrid,
          gv_connid TYPE sflight-connid,
          gv_paymentsum TYPE sflight-paymentsum.
    
      SELECT SINGLE carrid connid paymentsum
          INTO (gv_carrid, gv_connid, gv_paymentsum)
          FROM sflight AS a
          WHERE EXISTS (SELECT *
                          FROM spfli
                          WHERE carrid = a~carrid
                          AND connid = a~connid)
          AND a~carrid = 'AA'.
        
      WRITE : gv_carrid,  gv_connid, gv_paymentsum.
    

Categories:

SAP/ABAP