ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [오라클] WITH문 사용법 및 예제
    SQL 2019. 10. 6. 19:07
    반응형

    WITH절은 서브쿼리가 여러 번 다시 사용될 때 편리하게 사용 (성능면에서도 좋음)

    FROM에서 어떠한 조건을 가진 테이블을 불러올 때, 그 조건을 가진 테이블 자체에 이름을 붙여서, 별도의 테이블로 인식하게 한다.

    WITH는 오라클9이상 지원

     

    [장점]

    같은 서브쿼리가 여러 번 사용된다면, WITH구문을 사용하는 것이 가독성이 좋다.

    WITH구문이 여러 번 사용될 때 성능적으로도 좋음

     

    [단점]

    SELECT를 사용할 때는 보기 편한 장점이 있지만 INSERT나 UPDATE, DELETE 처럼 

    직접 데이터에 변경이 있는 구문에 WITH구문을 '사용할 수는 있지만

    WITH 구문을 통째로 넣어야하기 때문에 비효율적이다. (WITH를 사용하는 의미가 없다.)

    만약 직접 데이터의 변경이 있을 것 같을때는 사용하지 않는 편이 좋음.

    [예제]

    1. 예제를 위한 테이블 생성, 데이터 삽입

    CREATE TABLE BBS1 (SEQ NUMBER, TITLE VARCHAR2(20), CONTENTS VARCHAR2(20));
    CREATE TABLE BBS2 (SEQ NUMBER, TITLE VARCHAR2(20), CONTENTS VARCHAR2(20));
    CREATE TABLE BBS3 (SEQ NUMBER, TITLE VARCHAR2(20), CONTENTS VARCHAR2(20));
    commit

    INSERT INTO BBS1 (SEQ,TITLE,CONTENTS) VALUES(1,'AAA','가');
    INSERT INTO BBS1 (SEQ,TITLE,CONTENTS) VALUES(2,'BBB','나');
    INSERT INTO BBS1 (SEQ,TITLE,CONTENTS) VALUES(3,'CCC','다');
    INSERT INTO BBS2 (SEQ,TITLE,CONTENTS) VALUES(1,'DDD','라');
    INSERT INTO BBS2 (SEQ,TITLE,CONTENTS) VALUES(2,'EEE','마');
    INSERT INTO BBS2 (SEQ,TITLE,CONTENTS) VALUES(3,'FFF','바');
    INSERT INTO BBS3 (SEQ,TITLE,CONTENTS) VALUES(1,'GGG','사');
    INSERT INTO BBS3 (SEQ,TITLE,CONTENTS) VALUES(2,'HHH','아');
    INSERT INTO BBS3 (SEQ,TITLE,CONTENTS) VALUES(3,'III','자');
    commit

     

    2. WITH구문 - 1개만 있을 때

    <사용법>

    WITH [WITH절 명칭] AS (SELECT [컬럼명] from [테이블명])

    SELECT [컬럼명] FROM [WITH절 명칭]

    <예제>

    WITH  WITH_BBS1
         AS (SELECT SEQ, TITLE
             FROM   BBS1
             WHERE  SEQ = 1
    )
    select  C.SEQ AS BBS1_SEQ
         , C.TITLE AS BBS1_TITLE
         , A.TITLE AS BBS2_TITLE
         , A.CONTENTS AS BBS2_CONTENTS
         , B.TITLE AS BBS3_TITLE
         , B.CONTENTS AS BBS3_CONTENTS
    from BBS2 A, BBS3 B, WITH_BBS1 C
    where A.SEQ = B.SEQ;

    <결과>

    *부가설명 : WITH_BBS1에서는  SEQ가 1인 값만 가져왔으므로 1과 AAA만 있지만 BBS2와BBS3 갯수에 의해 카테시안곱으로 표현되었다.

     

    3. WITH구문 - 여러개(2개 이상)

    <사용법>

    WITH [WITH절 명칭-1] AS (SELECT [컬럼명-1] FROM [테이블명-1]),

            [WITH절 명칭-2] AS (SELECT [컬럼명-2] FROM [테이블명-2])

    SELECT ALIAS명-1.[컬럼명-1]

            , ALIAS명-2.[컬럼명-2]

    FROM [WITH절 명칭-1] ALIAS명-1 

           ,  [WITH절 명칭-2] ALIAS명-2

    <예제>

    WITH  WITH_BBS1
      AS (SELECT SEQ, TITLE, CONTENTS
          FROM BBS1)
       ,  WITH_BBS2
      AS (SELECT SEQ, TITLE, CONTENTS
          FROM BBS2)
       ,  WITH_BBS3
      AS (SELECT SEQ, TITLE, CONTENTS
          FROM BBS3)
    select A.SEQ BBS1_SEQ
         , A.TITLE BBS1_TITLE
         , A.CONTENTS BBS1_CONTENTS
         , B.SEQ BBS2_SEQ
         , B.TITLE BBS2_TITLE
         , B.CONTENTS BBS2_CONTENTS
         , C.SEQ BBS3_SEQ
         , C.TITLE BBS3_TITLE
         , C.CONTENTS BBS3_CONTENTS
    from WITH_BBS1 A, WITH_BBS2 B, WITH_BBS3 C
    where A.SEQ = B.SEQ
    AND   A.SEQ = C.SEQ;

    *부가설명 : A,B,C의 SEQ가 같은 값끼리 가져온다.

    4. INSERT안에 WITH 사용법 

    INSERT INTO BBS1
    SELECT *
    FROM (WITH WITH_TAB
            AS (SELECT SEQ, TITLE, CONTENTS
                FROM BBS2
                WHERE SEQ = 1)
         SELECT * FROM WITH_TAB);

    이렇게 사용할 수도 있겠지만 아래의 WITH 없는 쿼리문을 보자.

    INSERT INTO BBS1
    SELECT *
    FROM (SELECT SEQ, TITLE, CONTENTS
                FROM BBS2
                WHERE SEQ = 1);

    WITH를 쓰면 오히려 쿼리문이 더 길어진다. INSERT/UPDATE/DELETE에서는 사용하지 않는 것을 추천한다.

     

     

    본문의 출처 https://epdl-studio.tistory.com/

    반응형

    댓글

Designed by Tistory.