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 |