ABAP-Select

유재용·2025년 3월 19일

ABAP

목록 보기
11/11

ABAP SELECT 문 개요

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].

주요 구성 요소

1. SELECT 옵션

  • SELECT * : 테이블의 모든 필드 선택
  • SELECT SINGLE : 조건에 맞는 첫 번째 레코드만 선택
  • SELECT field1 field2 : 특정 필드만 선택

2. FROM 절

데이터를 검색할 테이블을 지정합니다.

SELECT * FROM vbak WHERE vbeln = '0000001234'.

3. WHERE 절

조회 조건을 지정합니다.

SELECT * FROM kna1 WHERE land1 = 'KR' AND name1 LIKE 'S%'.

4. ORDER BY 절

결과 정렬 방식을 지정합니다.

SELECT * FROM mara 
  WHERE mtart = 'FERT' 
  ORDER BY ersda DESCENDING.

5. INTO 절

조회된 데이터를 저장할 대상을 지정합니다.

* 내부 테이블로 데이터 저장
SELECT * FROM sflight INTO TABLE lt_flights.

* 구조체로 단일 레코드 저장
SELECT SINGLE * FROM sflight INTO ls_flight WHERE carrid = 'LH'.

6. CORRESPONDING FIELDS OF 문법

데이터베이스 테이블과 타겟 구조 사이에 이름이 같은 필드만 복사하는 기능입니다. 구조가 다른 내부 테이블이나 구조체에 데이터를 맞춰서 가져올 때 유용합니다.

* 내부 테이블의 구조와 일치하는 필드만 복사
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를 사용하면 필드 이름이 같은 경우에만 데이터가 복사되므로, 타겟 구조체나 테이블에 없는 필드는 무시됩니다. 이를 통해 초기화 작업 없이 필요한 필드만 복사할 수 있습니다.

자주 사용되는 SELECT 패턴

내부 테이블로 데이터 검색

DATA: lt_kna1 TYPE TABLE OF kna1.

SELECT * FROM kna1 INTO TABLE lt_kna1
  WHERE land1 = 'KR'.

IF sy-subrc = 0.
  " 데이터 처리 로직
ENDIF.

JOIN 사용 예시

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 사용 예시

FOR ALL ENTRIES를 사용할 때는 다음과 같은 중요한 고려사항들이 있습니다:

  • 중복값 처리: 입력 테이블(FOR ALL ENTRIES IN)에 중복된 값이 있는 경우, 데이터베이스에서 중복된 조회가 발생할 수 있습니다. 이를 방지하기 위해 SORT와 DELETE ADJACENT DUPLICATES를 사용하여 중복을 제거하는 것이 좋습니다.
* 중복 제거 예시
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를 사용할 때 입력 테이블이 비어있는 경우, WHERE 절의 조건이 무시되어 전체 테이블이 조회될 수 있습니다. 이는 성능 문제와 예상치 못한 결과를 초래할 수 있으므로 반드시 IS NOT INITIAL 체크가 필요합니다.

이러한 고려사항들을 준수하면 FOR ALL ENTRIES를 사용할 때 발생할 수 있는 일반적인 문제들을 예방할 수 있습니다.

다른 내부 테이블의 항목을 기준으로 조회할 때 사용합니다.

성능 고려사항

  • 필요한 필드만 선택: SELECT *보다 필요한 필드만 명시하는 것이 효율적
  • 인덱스 활용: WHERE 절에 인덱스 필드를 사용하여 성능 향상
  • 데이터 양 제한: 필요한 경우 UP TO n ROWS 절을 사용하여 데이터 양 제한
  • FOR ALL ENTRIES: 사용 전 입력 테이블이 비어있지 않은지 확인 필수

신규 ABAP SQL 문법 (ABAP 7.40 이상)

ABAP 7.40부터 도입된 새로운 SQL 문법은 더 직관적이고 간결한 코드 작성이 가능합니다. 주요 변경사항과 특징은 다음과 같습니다:

1. 인라인 데이터 선언과 데이터 사용

SELECT FROM sflight
  FIELDS carrid, connid, fldate, price
  WHERE carrid = 'LH'
  INTO TABLE @DATA(lt_flights).

위 예시에서 @DATA(lt_flights)는 결과를 저장할 내부 테이블을 인라인으로 선언합니다.

2. 호스트 변수 참조 '@' 기호 사용

DATA: lv_carrid TYPE s_carr_id VALUE 'LH'.

SELECT * FROM sflight 
  WHERE carrid = @lv_carrid
  INTO TABLE @DATA(lt_result).

변수 앞에 '@'를 붙여 호스트 변수임을 명시적으로 표시합니다.

3. SQL 표현식과 함수

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 표현식과 함수를 직접 사용하여 데이터를 변환하거나 계산할 수 있습니다.

4. 더 명확한 JOIN 구문

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 구문이 더 명확하게 구조화되어 가독성이 향상되었습니다.

5. 그룹화와 집계 함수

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).

그룹화 및 집계 함수를 사용하여 데이터를 분석할 수 있습니다.

6. CTE(Common Table Expression) 지원

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를 사용하여 복잡한 쿼리를 더 명확하게 구성할 수 있습니다.

7. UNION과 UNION ALL

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 구문이 더 직관적으로 개선되었습니다.

8. 서브쿼리 사용

SELECT * FROM spfli
  WHERE carrid IN (
    SELECT carrid FROM scarr
    WHERE currcode = 'EUR'
  )
  INTO TABLE @DATA(lt_flights).

서브쿼리를 사용하여 조건을 더 복잡하게 구성할 수 있습니다.

이러한 새로운 문법은 코드의 가독성을 크게 향상시키고, 개발자의 생산성을 높이며, SQL 표준에 더 가까운 방식으로 쿼리를 작성할 수 있게 합니다.

profile
ABAP 개발자

0개의 댓글