서브쿼리 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 절로 단계를 분리하라. 코드는 위에서 아래로 읽혀야 한다.