WITH, WITH RECURSIVE

JYJ·2022년 8월 16일
0

SQL / MySQL

목록 보기
22/25

WITH

  • 가상/임시 테이블을 만드는 방법이다.

  • 데이터베이스에 저장되는 테이블은 아니다.

  • 메인쿼리에서 쓸 서브쿼리를 미리 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에서는 줄을 띄우지않고 연속해서 써야 돌아감




WITH RECURSIVE

  • 가상의 테이블을 저장한다.

  • 반드시 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;


profile
Study note

0개의 댓글