계층 쿼리: CONNECT BY 와 재귀 CTE
계층 쿼리: CONNECT BY 와 재귀 CTE
조직도, 메뉴 트리, 게시판 답글처럼 "부모-자식" 관계가 여러 단계로 이어진 데이터는 한 번의
JOIN으로 끝까지 따라갈 수 없습니다. 이 레슨은 재귀 CTE(WITH RECURSIVE)로 위아래로 전개하는 방법과 순환 막기, Oracle·Tibero 전용CONNECT BY를 비교합니다.CONNECT BY는 H2 미지원이라 결과는 도식으로 보입니다.
1. 왜 배우는가
emp 테이블의 mgr 컬럼은 상사의 id 를 가리킵니다. 사원의 상사를 찾는 것은 자기 자신과 한 번 조인하면 됩니다. 하지만 "대표 아래 전체 조직", "이 사원의 결재 라인 끝까지", "부서장 밑의 인원 수" 는 단계가 몇 개인지 미리 알 수 없어서 조인을 몇 번 쓸지 정할 수 없습니다.
계층 쿼리는 이 깊이를 데이터가 정하게 합니다. 시작 행을 하나 정하고, 그 행에 이어지는 자식 행을 더 이상 나오지 않을 때까지 되풀이해서 붙입니다. 표준은 재귀 CTE이고, Oracle 은 오래전부터 CONNECT BY 라는 전용 문법을 제공합니다.
두 방식을 모두 알아야 하는 이유는 현장에 둘 다 있기 때문입니다. Oracle·Tibero 로 만든 옛 쿼리는 CONNECT BY 가 많고, MySQL·MSSQL 은 재귀 CTE 만 됩니다. 재귀 CTE 는 순환 데이터가 들어오면 끝나지 않으니 멈추는 장치도 함께 배웁니다.