서브쿼리 vs CTE 차이는? #shorts #SAP #ABAP
Moderator
· 조회 3
중첩 서브쿼리, 정말 읽을 수 있나요?
ABAP 개발 중 SELECT 문 안에 SELECT가 또 들어가고, 그 안에 또 들어가는 코드를 본 적 있나요? 작성한 본인도 일주일 뒤에 보면 해석이 어렵습니다. ABAP 7.50 이상에서는 CTE(Common Table Expression)를 사용해 이런 복잡한 쿼리를 깔끔하게 정리할 수 있습니다.
Before: 중첩 서브쿼리의 늪
고객별 최근 주문액 평균보다 큰 주문을 조회하는 예시입니다.
SELECT kunnr, vbeln, netwr
FROM vbak
WHERE netwr > ( SELECT AVG( netwr )
FROM vbak AS v2
WHERE v2~kunnr = vbak~kunnr
AND v2~erdat IN ( SELECT MAX( erdat )
FROM vbak AS v3
WHERE v3~kunnr = v2~kunnr ) )
INTO TABLE @DATA(lt_orders).
중첩이 3단계만 되어도 alias가 꼬이고, 어떤 조건이 어디에 걸리는지 추적이 어렵습니다.
After: CTE(WITH 절)로 분리
ABAP CDS가 아닌 Open SQL에서도 7.50부터 WITH 절을 지원합니다.
WITH
+recent_date AS (
SELECT kunnr, MAX( erdat ) AS max_date
FROM vbak
GROUP BY kunnr ),
+avg_amount AS (
SELECT v~kunnr, AVG( v~netwr ) AS avg_netwr
FROM vbak AS v
INNER JOIN +recent_date AS r
ON v~kunnr = r~kunnr AND v~erdat = r~max_date
GROUP BY v~kunnr )
SELECT k~kunnr, k~vbeln, k~netwr
FROM vbak AS k
INNER JOIN +avg_amount AS a
ON k~kunnr = a~kunnr
WHERE k~netwr > a~avg_netwr
INTO TABLE @DATA(lt_orders).
각 단계가 이름을 가진 임시 결과 집합이 되어, 위에서 아래로 자연스럽게 읽힙니다.
가독성만? 성능도 챙긴다
중첩 서브쿼리는 옵티마이저가 매 행마다 재평가하는 경우가 많지만, CTE는 한 번 평가된 중간 결과를 재사용하기 좋은 구조입니다. HANA DB 환경에서는 실행 계획이 더 단순해지고, 동일 서브쿼리 중복 작성도 사라집니다.
주의할 점
CTE 이름은 반드시 +로 시작해야 하며, 마지막에는 일반 SELECT가 와야 합니다. 또한 INSERT/UPDATE/DELETE의 소스로는 사용할 수 없고, ABAP 7.50 SP02 이상에서 지원됩니다.
핵심 한 줄
3단 중첩 서브쿼리를 마주쳤다면, WITH 절로 단계를 분리하라. 코드는 위에서 아래로 읽혀야 한다.