-
[오라클] 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));
commitINSERT 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','자');
commit2. WITH구문 - 1개만 있을 때
<사용법>
WITH [WITH절 명칭] AS (SELECT [컬럼명] from [테이블명])
SELECT [컬럼명] FROM [WITH절 명칭]
<예제>
WITH WITH_BBS1AS (SELECT SEQ, TITLEFROM BBS1WHERE 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_CONTENTSfrom BBS2 A, BBS3 B, WITH_BBS1 Cwhere 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_BBS1AS (SELECT SEQ, TITLE, CONTENTSFROM BBS1), WITH_BBS2AS (SELECT SEQ, TITLE, CONTENTSFROM BBS2), WITH_BBS3AS (SELECT SEQ, TITLE, CONTENTSFROM 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_CONTENTSfrom WITH_BBS1 A, WITH_BBS2 B, WITH_BBS3 Cwhere A.SEQ = B.SEQAND A.SEQ = C.SEQ;*부가설명 : A,B,C의 SEQ가 같은 값끼리 가져온다.
4. INSERT안에 WITH 사용법
INSERT INTO BBS1SELECT *FROM (WITH WITH_TABAS (SELECT SEQ, TITLE, CONTENTSFROM BBS2WHERE SEQ = 1)SELECT * FROM WITH_TAB);이렇게 사용할 수도 있겠지만 아래의 WITH 없는 쿼리문을 보자.
INSERT INTO BBS1SELECT *FROM (SELECT SEQ, TITLE, CONTENTSFROM BBS2WHERE SEQ = 1);WITH를 쓰면 오히려 쿼리문이 더 길어진다. INSERT/UPDATE/DELETE에서는 사용하지 않는 것을 추천한다.
반응형'SQL' 카테고리의 다른 글
이퀴조인 (EQUI JOIN) 아우터 조인(Outer Join) (0) 2020.04.05 [오라클] ORACLE VIEW(뷰) 사용법 및 예제 (0) 2019.10.13 오라클 UNION, INTERSECT, MINUS (0) 2019.09.29 오라클 LOOP사용, 테이블에 테스트 데이터 넣기 (0) 2019.04.12 (DATABASE) 날짜추가 함수 ( 오라클 / MSSQL / Mysql ) (0) 2019.04.08