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