SELECT *
FROM (SELECT department_id, count(*) cnt
        FROM hr.employees
        GROUP BY department_id) d, (SELECT max(cnt) FROM d) m;
-- InlineView에서 생성한 가상 테이블을 다시 호출하면 오류 발생한다.

■ WITH 문(9i)
- 두번이상 반복되는 SELECT문을 QUERY BLOCK(가상테이블)을 만들어서 사용한다.
- 성능을 향상시킬 수 있다.

WITH
    가상테이블1(QUERY BLOCK) AS (SUBQUERY),
    가상테이블2(QUERY BLOCK) AS (SUBQUERY),
    가상테이블3(QUERY BLOCK) AS (SELECT * FROM 가상테이블1),
    ...,
    가상테이블N(QUERY BLOCK) AS (SUBQUERY) -- 콤마없이 마감
    
    SELECT *
    FROM 가상테이블N, ...
    ...;

 

WITH
dept_cnt AS (SELECT department_id, count(*) cnt
                FROM hr.employees
                GROUP BY department_id),
dept_cnt_max AS (SELECT max(cnt) max_cnt FROM dept_cnt)

SELECT *
FROM dept_cnt_max;

 

WITH
dept_cnt AS (SELECT department_id, count(*) cnt
                FROM hr.employees
                GROUP BY department_id),
dept_cnt_max AS (SELECT max(cnt) max_cnt FROM dept_cnt)

SELECT d2.*, l.city, d1.cnt
FROM dept_cnt d1, hr.departments d2, hr.locations l
WHERE d1.department_id = d2.department_id
AND d2.location_id = l.location_id
AND d1.cnt = (SELECT max_cnt FROM dept_cnt_max);

 

'Oracle SQL' 카테고리의 다른 글

10 Subquery, Merge, Primary Key, Foreign Key  (0) 2023.10.19
09-2 권한, 테이블, INSERT, UPDATE, DELETE  (0) 2023.10.18
08 집합연산자, 그룹화, 계층검색  (0) 2023.10.17
07 PIVOT, UNPIVOT, SCALAR SUBQUERY  (0) 2023.10.16
06 SUBQUERY  (0) 2023.10.13