WITH절

WITH절을 사용하여 변환 없이도 복합 서브쿼리에 대해 쿼리 속도를 개선할 수 있습니다. 이를 서브쿼리 팩토링이라고도 하며, 서브쿼리를 여러 번 시작할 때 사용됩니다.

WITH절 구문은 이전에 SELECT 구문이 허용된 모든 위치에서 이의 사용을 허용합니다(INSERT, UPDATE, DELETE, CTAS 및 SELECT).

WITH절에 대한 재귀 쿼리는 지원되지 않습니다.

WITH 절 구문을 지원하지 않는 Netezza Performance Server 시스템 버전으로 다운그레이드하기 전에 이 새 구문을 사용하는 모든 SQL 개체(뷰 및 저장 프로시저)를 시스템에서 제거해야 합니다.

구문

WITH절을 사용하는 구문은 다음과 같습니다.
<query expression > ::=
    [ <WITH clause>] <query expression body>;
<with list> ::=
      <with list element> [ { <comma> <with list element> }… ]

<with list element> ::=
      <query name> [ <left paren> <with column list> <right paren> ]
         AS <left paren> <query expression> <right paren> [ <search or 
cycle clause> ]

<with column list> ::= <column name list>

<query expression body> ::=
      <query term>
      | <query expression body> UNION [ ALL | DISTINCT ]
         [ <corresponding spec> ] <query term>
      | <query expression body> EXCEPT [ ALL | DISTINCT ]
         [ <corresponding spec> ] <query term>

<query term> ::=
      <query primary>
      | <query term> INTERSECT [ ALL | DISTINCT ]
         [ <corresponding spec> ] <query primary>

<query primary> ::=
      <simple table>
      | <left paren> <query expression body> <right paren>

<simple table> ::=
<query specification>
| <table value constructor>
| <explicit table>

<explicit table> ::= TABLE <table or query name>

<corresponding spec> ::=
      CORRESPONDING [ BY <left paren> <corresponding column list> <right 
paren> ]

<corresponding column list> ::= <column name list>

입력

WITH절의 입력은 다음과 같습니다.
표 1. WITH절 입력
입력 설명
<쿼리 이름> 쿼리 표현식에 제공되는 이름입니다. 다중 쿼리 이름 및 표현식 조합을 쉼표로 분리하여 표현할 수 있습니다.
<expression> 테이블 컬럼 또는 표현식의 이름입니다.

출력

WITH절의 출력은 다음과 같습니다.
테이블 2. WITH절 출력
출력 설명
ROWS 쿼리의 결과인 전체 행 세트를 리턴합니다.
COUNT 쿼리에서 리턴하는 행 수를 리턴합니다.
ERROR: Not Supported 현재는 시스템에서 이의 사용이 지원되지 않습니다.

사용량

샘플 사용법은 다음과 같습니다.
  • 삽입할 때 WITH절을 사용합니다.
    MYDB.SCH1(USER)=> INSERT INTO emp_copy WITH employee AS (select * from 
    emp) SELECT * FROM employee;
  • 업데이트할 때 WITH절을 사용합니다.
    MYDB.SCH1(USER)=> UPDATE emp_copy SET grp = 'gone' WHERE id = 
    (WITH employee AS (select * from emp) SELECT id FROM employee WHERE id 
    = 1);
  • 삭제할 때 WITH절을 사용합니다.
    MYDB.SCH1(USER)=> DELETE FROM emp_copy WHERE id IN 
    (WITH employee AS (SELECT * FROM emp_copy where grp = 'gone')     
    SELECT id FROM employee);
  • WITH절을 사용하여 SELECT문에서 다중 절의 다중 서브쿼리를 실행합니다.
    WITH    manager (mgr_id, mgr_name, mgr_dept) AS 
       (SELECT id, name, grp
        FROM emp_copy
        WHERE mgr = id AND grp != 'gone'), 
    employee (emp_id, emp_name, emp_mgr) AS 
       (SELECT id, name, mgr_id
        FROM emp_copy JOIN manager ON grp = mgr_dept),
    mgr_cnt (mgr_id, mgr_reports) AS
        (SELECT mgr, COUNT (*)
        FROM emp_copy
        WHERE mgr != id
        GROUP BY mgr)
    SELECT *
    FROM employee JOIN manager ON emp_mgr = mgr_id JOIN mgr_cnt
    WHERE emp_id != mgr_id
    ORDER BY mgr_dept;