Oracle sql 서브 쿼리, with 절 정리


oracle DB에 있는 서브 쿼리, with 절을 정리 하려 합니다.

쿼리 작성시에, 그냥 테이블 끼리 사용을 하는 경우도 있지만

어떠한 테이블의 일부 내용들을 사용해서 쿼리를 작성해야되는 경우가 있다.

이러한 경우에 소괄호 안에 쿼리 내용을 넣어서

다른 쿼리에서도 사용할 수 있도록 하는 서브 쿼리를 쓸 수 있다.


1.서브쿼리

일반적인 구조로 예시를 들자면

SELECT * FROM TABLE1 

WHERE c1 IN (SELECT C1 FROM TABLE2);

로 WHERE 조건에 소괄호로 쿼리를 하나 더 적은 것이다.

이렇게 WHERE 절이나 HAVING 절에 적는 서브쿼리를

중첩 서브 쿼리라고 한다.


만약 SELECT 절에 해당 서브 쿼리가 들어간다면

스칼라 서브 쿼리라고 하는데

해당 SELECT절에 들어가는 서브쿼리는 반환값이

다중 행, 열이게 되면 에러가 발생한다.

즉, 단일 열이 나올수 있도록 여러 개의 서브쿼리를 나눠서 사용하는 것은 되지만

2개 이상의 열이 나오도록 한 번에 소괄호를 묶거나

하나의 행에 2개 이상의 결과값이 나오는 경우에는 에러가 발생한다는 것이다.


마지막으로 FROM절에 사용하는 경우는 인라인 뷰(INLINE VIEW)라고 한다.

즉시 처리되는 뷰라는 뜻으로 주로 쓰이는 경우는

FROM절에 들어가는 테이블에서 특정 조건에 맞게 먼저 처리를 하고

사용을 해야되기 때문에 서브 쿼리를 사용하는 경우이다.


2.WITH 절 사용하기

WITH 절은 서브쿼리를 별도의 절로 기술해서 반복적으로 사용할 수 있게 하는 것이다.

서브쿼리를 넣을수도 있고, 별도로 함수, 프로시저를 선언할 수 도 있다.

WITH query_name1 AS (subquery1)
, query_name2 AS (subquery2)
SELECT ~
FROM query_name1, query_name2

이런식으로 기존 쿼리 중간에 들어갔던 서브쿼리를

WITH절이 있는 제일 위로 올리고 해당 쿼리의 명칭을 AS를 통해서 지정한다.

해당 WITH절의 가장 큰 장점은 쿼리를 여러 번 사용하는 경우이다.

쿼리 길이가 확실히 줄어들고

중간에 들어가는 서브 쿼리 대신에 맨 위에 서브 쿼리가 모아져서 있기 때문에

쿼리를 해석하는데도 더 용이하다.

게다가 서브 쿼리들을 , 하나로 모아서 여러개를 작성 또한 가능하다.