CS Student’s SAP&Tech Journey✨

[SAP] JOIN 조인 본문

SAP/조인 Join

[SAP] JOIN 조인

인포마틱 2025. 2. 21. 18:16

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.