CS Student’s SAP&Tech Journey✨
[SAP] JOIN 조인 본문
SAP 시스템에서 데이터를 조회할 때 여러 개의 테이블을 조인하여 원하는 데이터를 가져와야 하는 경우가 많습니다.
예를 들어, 학생 정보와 성적가 별도의 테이블에 저장되어 있다면, 학생의 성적을 조회하려면 두 개의 테이블을 연결해야 합니다.
ABAP Open SQL에서는 이를 위해 JOIN(조인) 을 사용합니다.
이번 포스팅에서는 INNER JOIN, LEFT OUTER JOIN의 개념과 차이점, 그리고 ABAP에서 JOIN을 활용하는 방법을 설명하겠습니다.
1. JOIN이란?
✔️ JOIN(조인)은 두 개 이상의 테이블을 연결하여 데이터를 조회하는 방법입니다.
✔️ SAP의 ABAP Open SQL에서는 INNER JOIN과 LEFT OUTER JOIN을 지원하며, 이를 활용하면 관련 데이터를 한 번에 가져올 수 있습니다.
2. JOIN의 종류
1️⃣ INNER JOIN (내부 조인)
- INNER JOIN은 두 테이블에 공통된 데이터가 있을 때만 결과를 반환합니다.
- 조인 조건을 만족하는 데이터만 가져오므로, 한쪽 테이블에만 있는 데이터는 제외됩니다.
📌 INNER JOIN 문법
기존 OPEN SQL
SELECT A~필드1 A~필드2 B~필드3
INTO [CORRESPONDING FIELDS OF] TABLE lt_result
FROM 테이블A INNER JOIN 테이블B
ON 테이블A~공통필드 = 테이블B~공통필드
WHERE 테이블A~조건필드 = 조건값.
최신 OPEN SQL
SELECT <필드 목록>
FROM 테이블A AS A
INNER JOIN 테이블B AS B
ON A.공통필드 = B.공통필드
INTO TABLE lt_result
WHERE 조건.
- 두 테이블에서 일치하는 데이터만 가져옴
📌 INNER JOIN 예제
예를 들어, 학생 테이블(ZSTUDENT_07)과 성적 테이블(ZSTDSCORE_07)에서 성적이 등록된 학생의 정보만 가져오고 싶다면 INNER JOIN을 사용합니다.
기존 OPEN SQL
SELECT SC~STDNR SC~SUBJECT SC~SCORE "성적 테이블에서 3개"
ST~STDNM "학생 테이블에서 1개"
FROM ZSTDSCORE_07 AS SC INNER JOIN ZSTUDENT_07 AS ST
ON SC~STDNR = ST~STDNR
INTO CORRESPONDING FIELDS OF TABLE gt_student "gt_student는 컬럼 4개로 구성된 WA"
WHERE SC~STDNR = p_id.
- INNER JOIN을 사용하여 학생(ZSTUDENT_07)과 성적(ZSTDSCORE_07)을 학번(STDNR) 기준으로 조인합니다.
- 성적이 없는 학생은 조회되지 않습니다.
- 결과에는 STDNR(학번), STDNM(이름), SUBJECT(과목), SCORE(점수)가 포함됩니다.
💡 즉, INNER JOIN은 양쪽 테이블에 데이터가 모두 존재해야만 결과가 반환됩니다.
2️⃣ LEFT OUTER JOIN (왼쪽 외부 조인)
- LEFT OUTER JOIN은 왼쪽 테이블의 모든 데이터를 가져오면서, 오른쪽 테이블에 일치하는 데이터가 있으면 함께 가져옵니다.
- 오른쪽 테이블에 데이터가 없으면 NULL 값이 반환됩니다.
📌 LEFT OUTER JOIN 문법
기존 OPEN SQL
SELECT 테이블A~필드1 테이블A~필드2 테이블B~필드3
INTO [CORRESPONDING FIELDS OF] TABLE lt_result
FROM 테이블A LEFT OUTER JOIN 테이블B
ON 테이블A~공통필드 = 테이블B~공통필드
WHERE 테이블A~조건필드 = 조건값.
최신 OPEN SQL
SELECT <필드 목록>
FROM 테이블A AS A
LEFT OUTER JOIN 테이블B AS B
ON A.공통필드 = B.공통필드
INTO TABLE lt_result
WHERE 조건.
- 왼쪽 테이블(A)의 모든 데이터를 가져오고, 오른쪽 테이블(B)의 데이터가 없으면 NULL 반환
- 왼쪽 테이블이 기준이므로, 한쪽(B)만 존재하는 데이터는 제외됨
📌 LEFT OUTER JOIN 예제
학생 테이블(ZSTUDENT_07)에서 모든 학생의 정보를 가져오면서, 성적이 있는 경우에만 성적을 함께 조회하고 싶다면 LEFT OUTER JOIN을 사용합니다.
기존 OPEN SQL
SELECT SC~STDNR SC~SUBJECT SC~SCORE "성적 테이블에서 3개"
ST~STDNM "학생 테이블에서 1개"
FROM ZSTDSCORE_07 AS SC LEFT OUTER JOIN ZSTUDENT_07 AS ST
ON SC~STDNR = ST~STDNR
INTO CORRESPONDING FIELDS OF TABLE gt_student "gt_student는 컬럼 4개로 구성된 WA"
WHERE SC~STDNR = p_id.
- LEFT OUTER JOIN을 사용하여 학생(ZSTUDENT_07)의 모든 데이터를 조회하면서, 성적(ZSTDSCORE_07)이 있는 경우 함께 가져옵니다.
- 성적이 없는 학생도 조회되며, 해당 학생의 성적 값은 NULL로 표시됩니다.
💡 즉, LEFT OUTER JOIN은 왼쪽 테이블의 모든 데이터를 유지하면서, 오른쪽 테이블의 데이터를 선택적으로 가져옵니다.
3. JOIN 활용 예제
📌 예제: 학번을 입력하면 해당 학생의 모든 성적을 조회하는 프로그램
테이블 ZSTUDENT_07과 ZSTDSCORE_07
기존 OPEN SQL 쿼리
PARAMETERS p_id TYPE zstdscore_07-stdnr.
* WA 타입: 학번, 이름, 수강한 과목, 점수
TYPES: BEGIN OF ts_student,
stdnr TYPE zstdscore_07-stdnr,
stdnm TYPE zstudent_07-stdnm,
subject TYPE zstdscore_07-subject,
score TYPE zstdscore_07-score,
END OF ts_student.
* IT 선언
DATA gt_student TYPE TABLE OF ts_student.
* WA 선언
DATA gw_student LIKE LINE OF gt_student.
SELECT SC~STDNR SC~SUBJECT SC~SCORE "성적 테이블에서 3개"
ST~STDNM "학생 테이블에서 1개"
FROM ZSTDSCORE_07 AS SC INNER JOIN ZSTUDENT_07 AS ST
ON SC~STDNR = ST~STDNR
INTO CORRESPONDING FIELDS OF TABLE gt_student
WHERE SC~STDNR = p_id.
LOOP AT gt_student INTO gw_student.
WRITE: / gw_student-stdnr, gw_student-stdnm,
gw_student-subject, gw_student-score.
ENDLOOP.