본문 바로가기
ABAP

ABAP New Open SQL / Join 종류 추가

2026.07.2812

1. Anti Join: 없는 데이터 찾기

LEFT JOIN과 IS NULL을 조합하면 상대 테이블에 없는 데이터를 찾을 수 있습니다.

SELECT FROM ska1 AS a
  LEFT OUTER JOIN skat AS t
    ON  t~ktopl = a~ktopl
    AND t~saknr = a~saknr
    AND t~spras = @sy-langu
  FIELDS a~ktopl,
         a~saknr
  WHERE t~saknr IS NULL
  INTO TABLE @DATA(lt_without_text).

이 방식으로 다음 데이터를 찾을 수 있습니다.

  • 계정명 없는 계정
  • 마스터에 없는 전표계정
  • 매핑되지 않은 재무제표 계정
  • 처리되지 않은 인터페이스 데이터

WHERE t~saknr IS NULL

이 조건은 LEFT OUTER JOIN 결과에서 오른쪽 테이블 T에 대응하는 행이 없다는 뜻입니다.

WHERE t~saknr = ' '

이 조건은 오른쪽 테이블 행은 존재하면서, 그 행의 SAKNR 값이 실제로 공백인 경우를 찾습니다. NULL = ' '의 비교 결과는 참이 아니므로 JOIN에 실패한 행은 조회되지 않습니다.

기준 계정T 테이블 계정IS NULL= ' '
10001000제외제외
2000매칭 행 없음 → NULL조회제외
공백공백인 실제 행 존재제외조회

중요한 점은 ABAP 인터널 테이블로 데이터를 가져온 후에는 DB의 NULL이 해당 ABAP 타입의 초기값으로 변환될 수 있다는 것입니다. 하지만 WHERE는 데이터베이스에서 먼저 실행되므로, 이 변환이 일어나기 전에 NULL과 공백을 구분합니다.

2. Cardinality 힌트

7.52로 업데이트 되면서 SQL Join 구문에 연결 되는 형식을 명시할 수 있게 됐습니다.

LEFT OUTER MANY TO ONE JOIN skat AS t
  ON  t~ktopl = a~ktopl
  AND t~saknr = a~saknr
  AND t~spras = @sy-langu

ONE TO ONE
ONE TO MANY
MANY TO ONE
MANY TO MANY
EXACT ONE TO ONE
EXACT ONE TO MANY
MANY TO EXACT ONE

Cardinality는 일부 DB, 특히 SAP HANA 옵티마이저가 불필요한 JOIN을 제거하는 데 사용할 수 있습니다.

하지만 실제 데이터 관계와 다르게 선언하면 SELECT 목록에 따라 결과가 달라지는 undefined behavior가 발생할 수 있으므로, 단순 성능 튜닝 목적으로 추측해서 선언하면 안 됩니다.

:SAP ABAP 7.58 Cardinality 설명

댓글

0

아직 댓글이 없어요.