가상/임시 테이블을 만드는 방법이다.
데이터베이스에 저장되는 테이블은 아니다.
메인쿼리에서 쓸 서브쿼리를 미리 with절에 기술해 주는것이라 생각하면 쉽다.
with절은 동일한 검색 쿼리를 반복적으로 사용할 때, 재사용성을 높이고자 사용한다.
WITH '임시테이블의 이름' AS
(
반복적으로 사용하게 되는 조회 쿼리
)
SELECT * FROM '임시테이블의 이름'
WITH aaa AS
(
SELECT '철수' AS naMe, 20 AS agE
UNION ALL
SELECT name, age
FROM temp
)
SELECT name, age FROM aaa;
-- Dbeaver Postgresql에서는 줄을 띄우지않고 연속해서 써야 돌아감
with A as (
select regdate_kst, count(*)
from 스키마이름.테이블이름
where game_id = 'A'
group by regdate_kst
order by regdate_kst
),
B as (
select regdate_kst, count(*)
from 스키마이름.테이블이름
where game_id = 'B'
group by regdate_kst
order by regdate_kst
)
select *
from A as AA
join B as BB
on AA.regdate_kst = BB.regdate_kst;
-- Dbeaver Postgresql에서는 줄을 띄우지않고 연속해서 써야 돌아감
가상의 테이블을 저장한다.
반드시 UNION을 사용 해야한다.
반드시 비반복문(Non-Recursive)도 최소한 1개는 요구된다. (처음 한번만 실행됨)
subquery에서 바깥의 가상의 테이블을 참조하는 문장(반복문)이 반드시 필요하다.
반복되는 문장은 반드시 정지조건이 요구된다.
WITH RECURSIVE 구문은 가상의 테이블을 생성하면서 가상 테이블 자신의 값을 참조하여(재귀적) 값을 결정할 때 사용된다.
WITH RECURSIVE cte AS (
-- Non-Recursive 문장 (첫번째 루프에서만 실행됨)
SELECT 0 AS num # 초기값 설정
UNION ALL
-- Recursive 문장 (읽어올 때마다 행의 위치가 기억되어 다음번 행으로 이동함)
SELECT num+1 AS num
FROM cte # 서브쿼리 바깥의 가상테이블(cte)을 참고
WHERE num<10 # 정지조건
)
SELECT * FROM cte;