Jit_Log

[Oracle] With 절 본문

IT 공부/Oracle & Tibero

[Oracle] With 절

준발이오 2024. 8. 6. 09:47

오라클9 이후부터 사용 가능한 이름이 부여 서브쿼리입니다. 가상 테이블을 만든다는 관점에서 VIEW TABLE 쓰임새가 비슷하지만 유지되는 성질과 하나의 SQL 내에서만 사용할 있다는 차이점이 있습니다.

 

WITH절은 복잡한 SQL에서 동일 블록에 대해 반복적으로 SQL문을 사용하는 경우 블록에 이름을 부여하여 재사용 있게 함으로서 쿼리 성능을 높일 있는데 WITH절을 이용하여 미리 이름을 부여해서 Query Block 만들 있습니다.

 

기본 문법

WITH TEST AS (
       SELECT '국어' 과목, 56 점수, '가수' 이름 FROM DUAL
             UNION ALL
       SELECT '수학' 과목, null 점수, null 이름 FROM DUAL
             UNION ALL
       SELECT '수학' 과목, null 점수, null 이름 FROM DUAL
             UNION ALL
       SELECT '과학' 과목, 76 점수, '다수' 이름 FROM DUAL
             UNION ALL
       SELECT '영어' 과목, 86 점수, '마수' 이름 FROM DUAL
)
SELECT * FROM TEST

 

WITH절에 정의된 내용을 한번만 사용한다면 서브쿼리를 사용하는것과 크게 성능차이가 나지 않습니다.

WITH문의 가장 큰 장점은 한번 WITH절의 내용을 한번에 올려놓고 계속 재사용한다는것에 큰 의미가 있기에 WITH절에 구문을 여러번 참조하는 쿼리를 만들수록 그 효과가 배로 증가합니다.

 

사용 (여러번 참조)

WITH TEST AS (
       SELECT '국어' 과목, 56 점수, '가수' 이름 FROM DUAL
             UNION ALL
       SELECT '수학' 과목, null 점수, null 이름 FROM DUAL
             UNION ALL
       SELECT '수학' 과목, null 점수, null 이름 FROM DUAL
             UNION ALL
       SELECT '과학' 과목, 76 점수, '다수' 이름 FROM DUAL
             UNION ALL
       SELECT '영어' 과목, 86 점수, '마수' 이름 FROM DUAL
)
SELECT * FROM TEST WHERE 과목 = '국어'
  UNION
SELECT * FROM TEST WHERE 과목 <> '과학'