본문 바로가기

ABAP 프로그래밍 개념/OPEN SQL

4. Selecting Data from Multiple Tables

지금까지 우리가 다룬 구문은 단일 테이블에서 데이터를 선택할 수 있게 해줍니다. 하지만 실제 애플리케이션에서는 외래 키가 있는 여러 테이블에 데이터가 분산되어 있습니다.

외래 키 관계에 있는 테이블에서 데이터를 선택하려면 조인 또는 SELECT 문과 함께 FOR ALL ENTRIES 추가를 사용할 수 있습니다. FOR ALL ENTRIES라는 Addition은 데이터베이스 테이블에서 데이터를 선택하고 이를 이전에 다른 데이터베이스 테이블에서 데이터를 Select한 Internal Table과의 데이터와 비교할 수 있게 해줍니다. 이는 두 개의 테이블에서 데이터를 처리하는 경우 효율적입니다.

아래 예시는 FOR ALL ENTRIES를 사용하는 구문을 보여줍니다. 여기에서 데이터는 먼저 데이터베이스 테이블 VBRK에서Interna Table인 IT_VBRK로 데이터가 SELECT되고, 그 다음 IT_VBRK 테이블의 데이터가 데이터베이스 테이블 VBRP에서 SELECT되도록 비교됩니다.
FOR ALL ENTRIES를 사용할 때는 비교에 사용되는 Internal Table이 비어 있지 않도록 해야 합니다. 그렇지 않으면 시스템은 제한 없이 SELECT 문을 실행합니다(특정 조건이 아닌 모든 데이터를 Scan하게 된다). 예시에 사용된 IF 문의 조건을 주목해주세요.

SELECT * 
  FROM vbrk
  INTO TABLE it_vbrk
  WHERE vbeln EQ p_vbeln.

IF sy-subrc IS INITIAL.

 SELECT * 
   FROM vbrp
   INTO TABLE it_vbrp
   FOR ALL ENTRIES IN it_vbrk
   WHERE vbeln EQ it_vbrk-vbeln.
   
ENDIF.

대안으로, 두 종류의 Join문이 다수의 테이블에서 데이터를 가져올 수 있게 해줍니다.

1) Inner Join
이너조인은 인터널 테이블로 첫번째 테이블과 조건에 맞는 필드값이 두번째 테이블에도 존재해야 인터널 테이블로 추출이 가능합니다. 

2) Outer Join
아우터 조인은 두 번째 테이블에 해당 항목이 존재하든 존재하지 않든, 첫 번째 테이블에서 데이터를 추출합니다.

아래 예시는은 Inner Join과 Outer Join 결과의 차이점을 강조하는데, 이 경우 내부 테이블에는 FLD1, FLD2, FLD3 세 필드가 있습니다.

Table A Table B
Field 1 Field 2 Field 1 Field 3
X 100 X ABC
Y 200 X DEF
Z 300 Z WXY

* Inner Join

FLD1 FLD2 FLD3
X 100 ABC
X 100 DEF
Z 300 WXY

*Outer Join

FLD1 FLD2 FLD3
X 100 ABC
X 100 DEF
Y 200 같은 조건 없어서 Blank
Z 300 WXY

아래 예시는 내부 조인을 사용하는 예제를 보여줍니다. 여기에서 우리는 scarr, spfli, sflight 데이터베이스 테이블의 carrname, connid 및 fldate 필드를 두 개의 Inner Join을 사용하여 연결합니다. 이를 통해 p_cityfr에서 p_cityto로 가는 항공편 목록이 생성됩니다. 각 테이블에 별칭(alias) 이름이 지정됩니다.

PARAMETERS: p_cityfr TYPE spfli-cityfrom,
            p_cityto TYPE spfli-cityto.
            
TYPES: BEGIN OF wa,
        fldate TYPE sflight-fldate,
        carrname TYPE scarr-carrname,
        connid TYPE spfli-connid,
       END OF wa.
       
DATA itab TYPE SORTED TABLE OF wa WITH UNIQUE KEY fldate carrname connid.

SELECT c~carrname p~connid f~fldate
  FROM ( ( scarr AS c INNER JOIN spfli AS p ON p~carrid = c~carrid
                                            AND p~cityfrom = p_cityfr
                                            AND p~cityto = p_cityto )
                      INNER JOIN sflight AS f ON f~carrid = p~carrid
                                            AND f~connid = p~connid )
  INTO CORRESPONDING FIELDS OF TABLE itab.

아래는 Outer Join의 예시입니다.

PARAMETERS p_cityfr TYPE spfli-cityfrom.

TYPES: BEGIN OF wa,
        carrid TYPE scarr-carrid,
        carrname TYPE scarr-carrname,
        connid TYPE spfli-connid,
END OF wa.

DATA itab TYPE SORTED ABLE OF wa WITH NON-UNIQUE KEY carrid.

START-OF-SELECTION.

SELECT s~carrid s~carrname p~connid
  FROM scarr AS s LEFT OUTER JOIN spfli AS p ON s~carrid = p~carrid
                                            AND p~cityfrom = p_cityfr
  INTO CORRESPONDING FIELDS OF TABLE itab.

 

SAP NetWeaver 7.40 SP5 이전 버젼에서는 Outer Join에 대해서 특정한 제한들이 있었습니다.

■ 조인 연산자 오른쪽에는 테이블이나 뷰만 올 수 있으며, 또 다른 조인 식은 올 수 없습니다.
■ ON 조건에서 논리 연산자( logical operator)로는 AND만 사용할 수 있습니다.
■ ON 조건에서의 모든 비교는 오른쪽 테이블의 필드를 포함해야 합니다.
■ Left Outer 조인의 WHERE 조건에서는 오른쪽 테이블의 필드를 사용할 수 없습니다.

SAP NetWeaver 7.40 SP5 이후의 새로운 Open SQL은 이전의 제한 사항들을 제거하고 RIGHT OUTER JOIN을 지원합니다. RIGHT OUTER JOIN은 LEFT OUTER JOIN과 유사하지만 LEFT와 RIGHT 테이블의 역할이 교환됩니다. 또한 두 개 이상의 테이블을 포함하는 JOIN 표현식도 개선되었습니다. 이전에는 JOIN을 왼쪽에서 오른쪽으로 수행해야 했으며, 즉 가장 왼쪽에있는 테이블을 먼저 결합해야 했습니다(Left-bracketing). 이제 새로운 Open SQL에서는 이러한 제한이 더 이상 적용되지 않습니다.

또한 아래와 같은 새로운 기능들이 추가되었습니다.

■ 이전에는 ON 조건에서 RIGHT 테이블의 필드를 가져와야 하는 제한이 제거되었습니다.
■ EQUAL(=) 연산자 외에도 BETWEEN 또는 GREATER THAN/LESS THAN 연산자를 ON 조건에서 사용할 수 있습니다.
■ LEFT OUTER JOIN 문에서도 RIGHT 테이블의 필드를 WHERE 절에서 사용할 수 있습니다.
■ 암시적 클라이언트 처리가 지원되므로 클라이언트 종속적인 테이블의 경우 MANDT 필드를 비교할 필요가 없습니다.
■ JOIN 표현식에서 사용할 수있는 최대 테이블 수는 50으로 증가되었습니다.

JOIN 기능을 구현하는 방법에 대해서는 ABAP documentation를 참조하시기 바랍니다. 조인을 사용하는 것은 처음에는 약간 복잡해 보일 수 있으므로, 많은 테이블에서 데이터를 필요로하는 경우에만 JOIN을 사용하고 FOR ALL ENTRIES를 사용하는 것을 연습하는 것이 좋습니다.

반응형

'ABAP 프로그래밍 개념 > OPEN SQL' 카테고리의 다른 글

OPEN SQL의 사용  (0) 2023.08.05
5. Processing Data from Databases via Internal Tables and Structures  (1) 2023.05.05
3. Selecting Data from Database Tables  (0) 2023.05.04
2.5 Normalization  (0) 2023.05.03
2.4 Relationship  (2) 2023.05.03