ABAP에서 SELECT 문은 데이터베이스에서 데이터를 검색하는 기본적인 SQL 명령입니다. SAP ABAP 프로그래밍에서 데이터베이스 테이블에서 데이터를 조회할 때 사용됩니다.
SELECT [SINGLE] [* | field1 field2 ... | ( field1 AS alias1, field2 AS alias2, ... )]
FROM dbtab
[WHERE condition]
[GROUP BY group_key]
[HAVING condition]
[ORDER BY sort_key]
[INTO [CORRESPONDING FIELDS OF] target].
데이터를 검색할 테이블을 지정합니다.
SELECT * FROM vbak WHERE vbeln = '0000001234'.
조회 조건을 지정합니다.
SELECT * FROM kna1 WHERE land1 = 'KR' AND name1 LIKE 'S%'.
결과 정렬 방식을 지정합니다.
SELECT * FROM mara
WHERE mtart = 'FERT'
ORDER BY ersda DESCENDING.
조회된 데이터를 저장할 대상을 지정합니다.
* 내부 테이블로 데이터 저장
SELECT * FROM sflight INTO TABLE lt_flights.
* 구조체로 단일 레코드 저장
SELECT SINGLE * FROM sflight INTO ls_flight WHERE carrid = 'LH'.
데이터베이스 테이블과 타겟 구조 사이에 이름이 같은 필드만 복사하는 기능입니다. 구조가 다른 내부 테이블이나 구조체에 데이터를 맞춰서 가져올 때 유용합니다.
* 내부 테이블의 구조와 일치하는 필드만 복사
DATA: lt_customer TYPE TABLE OF zst_customer.
SELECT * FROM kna1
INTO CORRESPONDING FIELDS OF TABLE lt_customer
WHERE land1 = 'KR'.
* 구조체의 경우에도 마찬가지로 적용
DATA: ls_customer TYPE zst_customer.
SELECT SINGLE * FROM kna1
INTO CORRESPONDING FIELDS OF ls_customer
WHERE kunnr = '0000001234'.
CORRESPONDING FIELDS OF를 사용하면 필드 이름이 같은 경우에만 데이터가 복사되므로, 타겟 구조체나 테이블에 없는 필드는 무시됩니다. 이를 통해 초기화 작업 없이 필요한 필드만 복사할 수 있습니다.
DATA: lt_kna1 TYPE TABLE OF kna1.
SELECT * FROM kna1 INTO TABLE lt_kna1
WHERE land1 = 'KR'.
IF sy-subrc = 0.
" 데이터 처리 로직
ENDIF.
SELECT a~vbeln a~erdat a~ernam b~posnr b~matnr
FROM vbak AS a
INNER JOIN vbap AS b ON a~vbeln = b~vbeln
INTO TABLE lt_result
WHERE a~auart = 'TA'
AND b~pstyv = 'TAN'.
FOR ALL ENTRIES를 사용할 때는 다음과 같은 중요한 고려사항들이 있습니다:
* 중복 제거 예시
SORT lt_matnr BY matnr.
DELETE ADJACENT DUPLICATES FROM lt_matnr COMPARING matnr.
* 그 후 FOR ALL ENTRIES 사용
IF lt_matnr IS NOT INITIAL.
SELECT *
INTO TABLE lt_mara
FROM mara
FOR ALL ENTRIES IN lt_matnr
WHERE matnr = lt_matnr-matnr.
ENDIF.
이러한 고려사항들을 준수하면 FOR ALL ENTRIES를 사용할 때 발생할 수 있는 일반적인 문제들을 예방할 수 있습니다.
다른 내부 테이블의 항목을 기준으로 조회할 때 사용합니다.
ABAP 7.40부터 도입된 새로운 SQL 문법은 더 직관적이고 간결한 코드 작성이 가능합니다. 주요 변경사항과 특징은 다음과 같습니다:
SELECT FROM sflight
FIELDS carrid, connid, fldate, price
WHERE carrid = 'LH'
INTO TABLE @DATA(lt_flights).
위 예시에서 @DATA(lt_flights)는 결과를 저장할 내부 테이블을 인라인으로 선언합니다.
DATA: lv_carrid TYPE s_carr_id VALUE 'LH'.
SELECT * FROM sflight
WHERE carrid = @lv_carrid
INTO TABLE @DATA(lt_result).
변수 앞에 '@'를 붙여 호스트 변수임을 명시적으로 표시합니다.
SELECT FROM sflight
FIELDS carrid, connid,
CASE WHEN seatsocc > 300 THEN 'High'
WHEN seatsocc > 100 THEN 'Medium'
ELSE 'Low' END AS occupancy,
price * seatsmax AS total_value
WHERE carrid IN ('LH', 'AA')
ORDER BY carrid, connid
INTO TABLE @DATA(lt_flights).
SQL 표현식과 함수를 직접 사용하여 데이터를 변환하거나 계산할 수 있습니다.
SELECT FROM vbak AS a
INNER JOIN vbap AS b ON a~vbeln = b~vbeln
FIELDS a~vbeln, a~erdat, a~ernam, b~posnr, b~matnr
WHERE a~auart = 'TA'
INTO TABLE @DATA(lt_sales).
JOIN 구문이 더 명확하게 구조화되어 가독성이 향상되었습니다.
SELECT FROM sflight
FIELDS carrid, connid,
MIN( price ) AS min_price,
MAX( price ) AS max_price,
AVG( price ) AS avg_price,
SUM( seatsocc ) AS total_passengers,
COUNT(*) AS flight_count
GROUP BY carrid, connid
HAVING SUM( seatsocc ) > 1000
INTO TABLE @DATA(lt_stats).
그룹화 및 집계 함수를 사용하여 데이터를 분석할 수 있습니다.
WITH +flights AS (
SELECT carrid, connid, COUNT(*) AS cnt
FROM sflight
GROUP BY carrid, connid
)
SELECT f~carrid, f~connid, f~cnt, c~carrname
FROM +flights AS f
INNER JOIN scarr AS c ON f~carrid = c~carrid
WHERE f~cnt > 10
INTO TABLE @DATA(lt_result).
CTE를 사용하여 복잡한 쿼리를 더 명확하게 구성할 수 있습니다.
SELECT carrid, connid, 'Flight' AS type FROM sflight
UNION ALL
SELECT carrid, carrname AS connid, 'Carrier' AS type FROM scarr
INTO TABLE @DATA(lt_combined).
여러 쿼리 결과를 하나로 합치는 UNION, UNION ALL 구문이 더 직관적으로 개선되었습니다.
SELECT * FROM spfli
WHERE carrid IN (
SELECT carrid FROM scarr
WHERE currcode = 'EUR'
)
INTO TABLE @DATA(lt_flights).
서브쿼리를 사용하여 조건을 더 복잡하게 구성할 수 있습니다.
이러한 새로운 문법은 코드의 가독성을 크게 향상시키고, 개발자의 생산성을 높이며, SQL 표준에 더 가까운 방식으로 쿼리를 작성할 수 있게 합니다.