[ABAP] OPEN SQL 데이터 읽기 - FOR ALL ENTRIES, GROUPING, SORT, SUBQUERY
15 Mar 2022 -
2 minute read
🌝 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
-
AGGREGATE 함수를 사용하기 위해서는 SELECT 구문에 GROUP BY를 사용해야 함
- AGGREGATE 함수 종류 : AVG(평균) / COUNT(개수) / MAX(최댓값) / MIN(최솟값) / STDDEV(표준편차) / SUM(합계) / VARIANCE(분산)
🌝 OPEN SQL : 데이터 읽기 - SORT
-
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.