쌓고 쌓다
[ABAP] LEFT OUTER JOIN할때 IS INITIAL 사용시 주의사항 본문
인턴 과정에서 선임분께 배운 내용을
과제중에 맞닥뜨린 내용이다!
아차~ 싶어서 블로그에 정리하고자한다.
먼저 쿼리에서 JOIN과 WHERE의 실행 순서는 어떻게 될까?
FROM, JOIN절이 실행 된 후에
WHERE절이 실행 된다.
JOIN 결과에 WHERE 조건이 적용되는 것 이다.
퀴즈
이제 문제 상황을 보자.
아래의 쿼리를 작성했다.
LEFT OUTER JOIN에 명시한 테이블 'D'에 WHERE 조건절을 사용한 부분을 눈여겨 보자.

D~ZFLAG는 CHAR 타입이다.
나는
'A' 테이블의 결과를 다 가져오면서
'D' 테이블의 ZFLAG 필드에 값이 없는 행을 가져오길 원했다.
Range Variable인 @RT_FLAG에는
IS INITIAL과 동일한 효과를 위해서
SIGN = 'I'
OPTION = 'EQ'
LOW = ''
조건이 들어갔다고 생각해보자.
'A 테이블' LEFT JOIN 'D 테이블'
결과에서
A와 D 테이블이 결합되어 나온 결과에
조건절로 D 테이블의 필드를 걸었을때
A 테이블의 결과 행들을 모두 가져올 수 있을까?
결론은 아니다.
'A 테이블' LEFT JOIN 'D 테이블'
결과에서 D 테이블과 조인이 안되어
D 테이블의 필드에 NULL 값이 들어가기에
WHERE절에 빈 문자열 ''과 같은 값들을 뽑아올때
NULL이 들어있는 행은 가져오지 않는다.
텍스트로는 이해하기 힘드니 사진으로 이해하자.
LEFT OUTER JOIN과 COALESCE !

A와 B 테이블을 가지고
조인 조건 A~A = B~C으로
LEFT OUTER JOIN을 한다고 하자.
조건절에 B 테이블의 D 필드를 가지고
B~D IS INITIAL 조건절을 넣는다면
A 테이블의 모든 행들을 뽑아올까?
아니다!!
조인 결과를 보자.

B 테이블의 D 필드에 INITIAL VALUE인 빈문자열 말고
NULL 값이 들어 있게 되기 때문에
조인이 이뤄지지 않은
A 테이블의 A 필드에 B, C 값이 들어 있는 행은
뽑아오지 않는 문제가 발생한다!

그래서 LEFT OUTER JOIN에 INITIAL VALUE를 조건절에 넣었다면
조인이 이뤄지지 않아 발생할 수 있는 NULL 값을 INITIAL VALUE로 변경해주는 과정이 필수이다.
핵심 결론
LEFT OUTER JOIN 결과로 NULL 값이 나올 수 있음을 유의하고
INITIAL VALUE 체크에 주의하자.
쿼리에서 INITIAL VALUE를 체크할땐
DB에서 해당 필드 속성이 INITIAL VALUE가 체크 되어있는지 확인하고
선택되어 있지 않을땐 COALESCE를 가지고 NULL 값을 INITIAL VALUE로 바꿔주자.
조인 결과로 나온 NULL 값은 쿼리가 처리되는 동안만 유효하고
ABAP 소스코드로 들어온 순간에
NULL 값이 아닌 INITIAL VALUE로 존재하게 됨을 유의하자.
'SAP > ABAP' 카테고리의 다른 글
| [ABAP] 동적 ALV Field Catalog (0) | 2025.09.16 |
|---|---|
| [ABAP] 엑셀 업로드와 BDC 프로그램 (0) | 2025.09.15 |
| [ABAP] SmartForms Loop 사용법과 집계 구하는법 (4) | 2025.09.03 |
| [ABAP] ALV Cell Edit과 BAPI_PO_CHANGE (13) | 2025.08.28 |
| SELECTION SCREEN에서 ToolBar 버튼 추가 및 삭제 (1) | 2025.08.14 |