1. join구문

종류 설명
INNER JOIN 양쪽 테이블에서 조건을 만족하는 행만 선택
LEFT OUTER JOIN 왼쪽 테이블의 모든 행 + 조건을 만족하는 오른쪽 테이블의 행
RIGHT OUTER JOIN 오른쪽 테이블의 모든 행 + 조건을 만족하는 왼쪽 테이블의 행
FULL JOIN ABAP Open SQL에서는 직접 지원하지 않음

 

- abap 프로그럄에서는 테이블 간의 join을 하기 보다는 인터널 테이블에 데이터를 저장하고, LOOP 구문을 이용해,

추가 정보를 SELECT 하여 인터널 테이블 내용을 MODIFY하는 경우가 많다

2. inner join 

TYPES : BEGIN OF t_str,
	carrid TYPE sflight-carrid,
    carrname TYPE scarr-carrname,
    END OF t_str.
    
 DATA : gs_str TYPE t_str.
 
 SELECT SINGLE a~carrid b~carrname
 INTO CORRESPONDING FIELDS OF gs_str
 FROM sflight as a
 INNER JOIN scarr as b
 on a~carrid = b~carrid
 WHERE a~carrid = 'AA'.
 
 WRITE : gs_str-carrid, gs_str-carrname.

출력 => AA American Airlines

- inner join은 a와 b 테이블에서 조건이 있는 공통점들을 추출하는 조인이다.

 

3. Outer join

- Inner join은 두 테이블 모두 일치하는 값이 있어야 결과가 나오지만, Outer join은 한 쪽 테이블에는 데이터가 있고 다른 쪽엔 없어도 결과를 보여준다.

JOIN 종류 설명
INNER JOIN 양쪽 테이블에 모두 존재하는 데이터만 결과로 가져옴
LEFT OUTER JOIN 왼쪽 테이블 기준, 오른쪽이 없어도 왼쪽 데이터는 결과에 포함됨
RIGHT OUTER JOIN 오른쪽 테이블 기준, 왼쪽이 없어도 오른쪽 데이터는 결과에 포함됨

- outer join은 단독으로 쓸 수 없으며 방향을 무조건 지정해야한다(Left or Right).

- 아밥 문법적으로 명확한 방향성이 있어야하기 때문이다. 

 

예를들어,

INSA 테이블은 사원 기본 정보를 저장, CERT 테이블은 사원이 취득한 자격증 벙보를 저장하고 있다고 치자.

사원 Konie와 Wonie는 자격증을 가지고 있지만, 사원 sonie는 자격증이 없다. 사원 번호 필드를 기준으로 Inner join 하게 되면 사원 sonie는 자격증이 없기 떄문에 결과에서 제외된다.

 

기본적으로는 모든 사원 정보는 조회하고, 자격증이 있는 경우만 추가적으로 보여주고자 할 때 OUTER JOIN이 필요하다.

 

 

 

 

1) interval조건

- 조건에 범위 값을 사용할 때 사용한다.

Select ... where <s> [not] BETWEEN <f1> AND <f2>

 

2) String 비교

- 문자열 비교할 떄는 LIKE or '_'문자를 사용한다.

 

COL2 = 'ABCDEFGHIJK'.

SELECT ~ WHERE COL2 LIKE 'ABC%'.

// 4문자 구할 때
WHERE COL2 LIKE 'ABC_'.

 

3) list value

SELECT a~carrid, a~connid, b~carrname
  INTO CORRESPONDING FIELDS OF TABLE @gt_str
  FROM sflight AS a
  LEFT OUTER JOIN scarr AS b
    ON a~carrid = b~carrid
  WHERE a~carrid IN ('AA', 'ZZ').

- List Value : in 구문을 사용해, 여러 조건에 속한 경우의 값을 가져올 수 있다. AA, ZZ 일 경우 whrere in ('aa', 'zz')를 사용할 수 있다.

 

4) selection table 

SELECT-OPTIONS: so_carrid FOR sflight-carrid.

 

이 줄은 -> ABAP이 자동으로 아래와 같은 내부테이블을 만든다.

sign option low high
I EQ AA  
I BT AB AD
I EQ LH  

 

 

5) Dynamic 조건

- select 구문의 조건을 설정하는 where구문을 동적으로 구성할 수 있다. Itab은 최대 72자리의 Internal table로 선언해야한다.

- 그래서 왜 dynamic조건일까? 그냥 where 다음의 조건절을 빼서, 그 변수에다 선언하면 되기 때문이다. 

즉, 문자열로 구성된 조건식을 where절에 직접 넘기기 때문에 다이나믹 이라고 불린다.

 

이 코드에서

CONCATENATE 'carrid = ''' gv_carrid '''' INTO gs_where.

// 결과 : carrid = 'AC'

결과는 carrid = 'AC'로 나온다.

이 문자열을 where (gs_where)에서 조건식처럼 사용할 수 있다.

// 일반적인 정적 조건문 
SELECT SINGLE carrname
  INTO gv_carrname
  FROM scarr
  WHERE carrid = 'AC'.

// 다이나믹 조건문
DATA: gs_where TYPE c LENGTH 72.
WHERE (gs_where).
-> 조건식 자체가 문자열로 되어있고, 실행 시점에 바뀔 수 있다.

- 사용자 입력값이나 설정값에 따라 매번 달라지는 경우

- select-options, parameters를 직접 파싱해서 동적 조건으로 만들고 싶을 때

- 복잡한 검색조건을 조합해서 쿼리에 반영할 때 유용하다.

 

 

- concatenate로 문자열을 이어붙여서 2개 이상의 조건이 필요할 경우, 동적으로 구성이 가능하다.

6) for all entries 

 

SELECT ...
  FROM <table>
  INTO TABLE <result_itab>
  FOR ALL ENTRIES IN <source_itab>
  WHERE <field> = <source_itab>-<field>.
DATA: lt_carrid TYPE TABLE OF sflight,
      lt_scarr  TYPE TABLE OF scarr.

SELECT carrid
  FROM sflight
  INTO TABLE lt_carrid
  WHERE price > 500.

IF lt_carrid IS NOT INITIAL.
  SELECT *
    FROM scarr
    INTO TABLE lt_scarr
    FOR ALL ENTRIES IN lt_carrid
    WHERE carrid = lt_carrid-carrid.
ENDIF.

 

7) GROUPING 

- group by는 SQL 집계 함수(count, sum, max, min)과 함께 데이터를 그룹별로 묶어서 처리할 때 사용하는 구문.

함수 설명
COUNT(*) 행 수를 센다
SUM(필드) 합계를 구한다
MAX(필드) 최대값
MIN(필드) 최소값
AVG(필드) 평균값 (SAP HANA에서만 가능)
STDDEV 표준편차
VARIANCE 분산
SELECT carrid, COUNT(*) AS cnt
  FROM sflight
  INTO TABLE @DATA(result)
  GROUP BY carrid.

LOOP AT result INTO DATA(ls_result).
  WRITE: / 'carrid: ', ls_result-carrid, 'cnt: ', ls_result-cnt.
ENDLOOP.

 

- 이런식으로 grouping을 하면, 각 carrid에 있는 항공사명의 Cnt를 셀 수 있게 된다.

 

- 항공기 ID별 평균 예약 점유율을 SELECT하는 구문을 실습하면, `Unknown column name "AVG"`라고 뜬다.

 

8) HAVING절 

 

- HAVING절로 조건문을 구할 수 있다.

 

7) SORT구문

- ORDER BY PRIMARY KEY

- 테이블의 key에 의해 정렬됨

- SELECT * 구문인 경우에만 사용가능

- JOIN 구문 및 VIEW에는 사용이 불가

 

SORT <internal_table> [BY <field1> [ASCENDING|DESCENDING] <field2> ...].

 

-> 오름차순, 내림차순 정렬을 사용할 수 있다.

 

9) 서브쿼리_sub query

 

  • 메인 쿼리(Main Query) 안에 또 다른 SELECT문을 넣은 것.
  • 결과를 조건값, 필드값, 또는 테이블로 사용하는 방식

스칼라 서브쿼리(Scalar Subquery)란?

  • 하나의 값만 반환하는 서브쿼리.
  • 주로 SELECT, WHERE, HAVING 절 안에서 사용됨.
  •  
SELECT carrid, connid, price
  INTO TABLE @DATA(result)
  FROM sflight
  WHERE price > (
    SELECT AVG( price )
      FROM sflight
  ).

 

✔️ 실습문제 예시

문제: sflight 테이블에서 평균 가격보다 높은 항공편의 carrid, connid, price를 출력하세요.

SELECT carrid, connid, price
  INTO TABLE @DATA(gt_result)
  FROM sflight
  WHERE price > (
    SELECT AVG( price ) FROM sflight
  ).

 

 

EXISTS 서브쿼리

  • **서브쿼리 결과가 존재하는지(true/false)**를 조건으로 확인.
  • 보통 상관 서브쿼리 형태로 많이 씀.
SELECT carrid, connid, price 
INTO TABLE @DATA(gt_exists) 
FROM sflight AS a 
WHERE EXISTS 
( SELECT * FROM scarr AS b WHERE b~carrid = a~carrid AND b~carrname = 'Lufthansa' ).
 

📝 의미: sflight에서 carrid가 Lufthansa인 항공사에 속한 데이터만 가져오기

 

IN 서브쿼리

  • 값이 특정 리스트 안에 있는지 확인할 때 사용
 
SELECT carrid, connid, price 
INTO TABLE @DATA(gt_in) FROM sflight 
WHERE carrid IN ( SELECT carrid FROM scarr WHERE currcode = 'EUR' ).

📝 의미: 유로(EUR) 화폐를 사용하는 항공사들의 항공편만 가져오기

 

종류 특징 예시
IN 여러 값을 비교할 때 carrid가 'LH', 'AA', 'AF' 중 하나
EXISTS 존재 여부만 확인 연결된 데이터가 있는지 확인
스칼라 한 개 값 반환 & 비교 평균보다 큰 값 찾기

 

'SAP' 카테고리의 다른 글

easy abap 12. Update  (0) 2025.05.09
easy abap 11. INSERT  (0) 2025.05.09
easy abap 09. SELECT  (0) 2025.05.08
easy abap 08. R/3 Architecture, OPEN SQL  (0) 2025.05.07
easy abap 07. constants, statics, tables  (0) 2025.05.07

+ Recent posts