CTE는 SQL에서 복잡한 서브 쿼리를 분리하여,
이름을 붙인 임시 테이블처럼 활용할 수 있는 문법입니다
WITH이라는 키워드를 사용하여 정의할 수 있습니다
CTE를 사용하는 주된 이유는 쿼리를 깔끔하게 관리하거나
같은 서브쿼리를 반복하지 않고 한번만 정의해서 재사용할 때 사용합니다
WITH SALES AS (
SELECT
CUSTOMER_ID
,ORDER_DATE
,TOTAL_PRICE
FROM ORDERS
WHER ORDER_DATE >= DATEADD(MONTH, -1, GETDATE())
)
SELECT
A.CUSTOMER_NAME,
B.ORDER_DATE
B.TOTAL_PRICE
FROM CUSTOMER A
INNER JOIN SALES B
ON A.ID = B.ID
위와같이 별도의 이름을 붙여 임시테이블처럼 관리할 수 있습니다
CTE를 사용하면 다음과 같은 장점을 얻을 수 있습니다
서브쿼리의 존재는 복잡해질 수록 부담스러워지는 존재입니다
읽기도 어려워지고 디버깅하기도 복잡해집니다
하지만 CTE를 사용하면 가독성을 확보하고 디버깅도 편해질 수 있습니다!
동일한 서브쿼리를 여러 곳에서 반복 작성해야할 때 유용합니다
하지만 CTE를 사용하면 한번 정의한 CTE를 메인쿼리에서 여러번 참조할 수 있습니다
하지만 CTE를 사용함에 있어 주의할 점도 존재합니다
CTE는 기본적으로 인라인 뷰처럼 처리되지만, 복잡한 로직을 반복 호출하면 그 비용이 커질 수 있습니다
따라서 대규모 데이터를 처리하는 CTE일 경우 사용에 유의해야합니다
재귀쿼리는 자신이 정의한 쿼리 결과를 다시 참조하여 데이터를 반복적으로 확인하는 방법입니다
재귀쿼리는 CTE를 활용해 결과를 단계별로 계산하며,
일반 CTE처럼 인라인 뷰로 최적화되어 실행됩니다
UNION을 활용하며, 시작점과 자기자신을 참조하는 영역으로 구분됩니다
WITH TEAM_DEPTH AS (
SELECT
TEAM_CODE
,TEAM_NAME
,PARENT_TEAM_CODE
,TEAM_LEVEL
FROM TEAM
UNION ALL
SELECT
T1.TEAM_CODE
,T1.TEAM_NAME
,T1.PARENT_TEAM_CODE
,T2.LEVEL + 1
FROM TEAM T1
INNER JOIN TEAM_DEPTH T2
ON T1.PARENT_TEAM_CODE = T2.TEAM_CODE
)
SELECT
E.EMP_CODE
,E.EMP_NAME
,T.TEAM_CODE
,T.TEAM_NAME
FROM EMP E
INNER JOIN TEAM_DEPTH T
ON E.EMP_CODE = T.TEAM_CODE
위와같이 부서간의 상하위 관계가 존재하며,
상위부서를 조회할 때, 하위 부서도 같이 조회해야한다면 재귀쿼리를 통해 문제를 해결할 수 있습니다