CTE(WITH) & 재귀 쿼리 — 트리 구조 조회 · 점진적 집계
📋 실습 안내
✏️ CODE EDITOR (JSX)
▶ 실행 버튼을 눌러 코드를 테스트하세요.
👁️ 내 미리보기
내 코드 실행 결과
🎯 완성 미리보기
목표
위 에디터 코드를 수정해서 이 결과물과 똑같이 만들어보세요!
💡 TODO 주석을 채워서 위 결과물처럼 동작하게 만들어보세요
🤖 AI 선생님에게 질문하기
이번 강의 전용
▼
선생님이 답변 중이에요...
⚠️ 학습 관련 질문만 답변합니다. 관련 없는 질문은 자동으로 학습으로 유도됩니다.
Q1. WITH RECURSIVE에서 재귀가 종료되는 시점은?
💡 재귀 CTE는 재귀 부분(UNION ALL 이하)이 빈 결과셋을 반환하면 종료됩니다. WHERE 절의 종료 조건이 거짓이 되어 더 이상 추가할 행이 없을 때 멈춥니다. 종료 조건 없이 작성하면 무한루프가 발생합니다.
Q2. CTE를 서브쿼리보다 선호해야 하는 가장 주요한 이유는?
💡 CTE의 가장 큰 장점은 같은 서브쿼리를 여러 번 재사용할 수 있고, 복잡한 쿼리를 단계별로 분리해 가독성을 높인다는 것입니다. 성능이 항상 서브쿼리보다 빠른 것은 아닙니다.
Q3. 재귀 CTE에서 `ARRAY[id]`를 path에 추가하는 이유는?
💡 재귀 탐색 중 이미 방문한 노드 ID를 배열에 기록하고, WHERE NOT c.id = ANY(s.path) 조건으로 순환 참조를 감지해 무한루프를 방지합니다. 조직도나 그래프 구조에서 순환이 있을 경우 필수적인 패턴입니다.
Q4. PostgreSQL에서 CTE 내부에서 사용 가능한 DML 문은?
💡 PostgreSQL은 CTE 내에서 INSERT, UPDATE, DELETE를 사용할 수 있으며, RETURNING 절로 변경된 데이터를 반환받아 이후 CTE에서 참조할 수 있습니다. 이는 MySQL에서 지원되지 않는 PostgreSQL 고유 기능입니다.
Q5. `WITH MATERIALIZED expensive AS (...)`의 의미는?
💡 MATERIALIZED 힌트는 PostgreSQL 12+에서 사용 가능하며, 쿼리 플래너가 CTE를 인라인으로 최적화하는 것을 막고 반드시 한 번만 실행해 결과를 임시 저장하도록 합니다. 계산 비용이 크고 여러 번 참조되는 CTE에 유용합니다.
😅
아쉽네요!
점수: 0점 — 70점 이상이 되어야 통과합니다.