300x250
728x90

# WITH문이란?


# WITH문은 공통 테이블 표현식( CTE, Common Table Expression )을 정의하는 사용이 된다.

 

* CTE( Common Table Expression )이란?

# 단일 문의 범위 내에 존재하고 나중에 해당 문 내에서 여러 번 참조될 수 있는 명명된 임시 결과 집합입니다.

(참고)

https://dev.mysql.com/doc/refman/8.0/en/with.html#common-table-expressions

 

MySQL :: MySQL 8.0 Reference Manual :: 15.2.20 WITH (Common Table Expressions)

15.2.20 WITH (Common Table Expressions) A common table expression (CTE) is a named temporary result set that exists within the scope of a single statement and that can be referred to later within that statement, possibly multiple times. The following disc

dev.mysql.com

 

 

* 사용하는 이유?


CTE쿼리의 가독성을 높이고, 복잡한 쿼리를 단순하게 작성할 수 있고, CTE로 정의한 부분을 여러 번 참조할 수 있어 코드 중복을 없앨 수 있다.  


 

CTE의 이름은 최대 30자까지 가능하며, " + "으로 연결할 수 있다. 

 

바로 넘어가 보자.

 

시작하기 전. ( 비밀번호 : GJWITH ) 


2024.05.14 - [.SAP/....ABAP 예제] - SAP WITH문 예제

 

SAP WITH문 예제

 

potato98.tistory.com

 

# 다음과 같은 리스트가 나오게 하는 것이 목표다. ( 예제 테이블 참고 )

 

# LOOP문을 통해서 하는 방법, OUTER JOIN 해서 SUM 하는 방법, 인터널 테이블 두 개 만들어서 JOIN 하는 방법 등등.. 방법은 정말 많기 때문에 참고하는 정도로 넘어가면 될 것 같다.

 

# 또한 여기서는 복잡한 쿼리가 사용되지가 않기 때문에 WITH문을 굳이 써야 하나 할 수도 있지만, 위에서 언급했듯이 여러 가지 장점 때문에 사용하기도 한다. ( 사람 취향 )

 

 

01. 화면에 뿌려줄 인터널 테이블을 만들어보자.


# 여기서는 간단하게 SALV로 만드려고 하니 참고 바란다.

TYPES: BEGIN OF TY_S_LIST,

  RESE         TYPE ZDRSE_GJ,
  RESE_T       TYPE ZDRSET_GJ,
  PRERESE_QUAN TYPE ZDPRERES_GJ,
  RESE_QUAN    TYPE ZDRES_GJ,

END OF TY_S_LIST .

DATA
  GT_LIST TYPE TABLE OF TY_S_LIST.

 

# 02. WITH문 사용하기


# 01. 우선 기준이 되는 테이블 우선으로 SELECT을 하기 위해서 WITH문을 만들어보자. ( WITH 이름은 최대 30 자릿수 )

 

# 02. 기준이 되는 테이블을 SELECT 해서 WITH에다 넣어보자.

# " +MAIN_RESER "이라는 인터널 테이블을 만들었다고 생각해 보자. 

 

#03. 그다음 SUM 할 값이 있는 테이블을 WITH문 사용해서 만들어보자. ( WITH 이름은 최대 30 )

# Group by 예약번호 기준으로 SUM 값을 구하는 SQL이다.

 

#04. 이제 두 개의 View( 인터널 테이블)을 이용해서 마지막에 SELECT을 해보자.

# 위에서 하나하나 SELECT 했던 View( 이터널 테이블)을 사용해서 INNER JOIN을 통해 한번에 데이터를 보여주게 만드는 로직  

TYPES: BEGIN OF TY_S_LIST,

         RESE         TYPE ZDRSE_GJ,
         RESE_T       TYPE ZDRSET_GJ,
         PRERESE_QUAN TYPE ZDPRERES_GJ,
         RESE_QUAN    TYPE ZDRES_GJ,

       END OF TY_S_LIST .

DATA
  GT_LIST TYPE TABLE OF TY_S_LIST.


SELECT
    a~rese,
    a~rese_t,
    a~prerese_quan,
    SUM( rese_quan ) AS rese_quan

  FROM ztreser_gj AS a
    LEFT OUTER JOIN ztresquan_gj AS b
    ON a~rese EQ b~rese
    INTO TABLE @gt_list
    GROUP BY a~rese, a~rese_t, a~prerese_quan.


"------------WITH---------------"
WITH
  +MAIN_RESER AS (
     SELECT
       RESE,
       RESE_T,
       PRERESE_QUAN
     FROM
       ZTRESER_GJ
     ),
  +SUM_RESE AS (
      SELECT
        RESE,
        SUM( RESE_QUAN ) AS RESE_QUAN
      FROM ZTRESQUAN_GJ
      GROUP BY RESE
)
 SELECT
    A~RESE,
    A~RESE_T,
    A~PRERESE_QUAN,
    B~RESE_QUAN
    FROM +MAIN_RESER AS A
    INNER JOIN +SUM_RESE AS B
      ON A~RESE EQ B~RESE
    INTO TABLE @GT_LIST.


  SORT GT_LIST BY RESE.



*-------------------------------------*
DATA:
  GR_SALV TYPE REF TO CL_SALV_TABLE.

DATA:
  COLUMNS TYPE REF TO CL_SALV_COLUMNS_TABLE.
*-------------------------------------*

CL_SALV_TABLE=>FACTORY(
  IMPORTING
    R_SALV_TABLE = GR_SALV
  CHANGING
    T_TABLE      = GT_LIST
).

COLUMNS = GR_SALV->GET_COLUMNS( ).
COLUMNS->SET_OPTIMIZE( ).


GR_SALV->DISPLAY( ).
*-------------------------------------*

 

 

# 03. 실행


 

WITH문 말고 다른 방법으로는..

SELECT
    a~rese,
    a~rese_t,
    a~prerese_quan,
    SUM( rese_quan ) AS rese_quan

  FROM ztreser_gj AS a
    LEFT OUTER JOIN ztresquan_gj AS b
    ON a~rese EQ b~rese
    INTO TABLE @gt_list
    GROUP BY a~rese, a~rese_t, a~prerese_quan.

 

# 끝.. 

 

도움이 되셨으면 하단에 있는 광고 한번씩 눌러주세유!!

728x90