728x90
반응형
WITH DR (DT) AS (
SELECT TO_CHAR(SYSDATE, 'YYYY') || '-01-01' AS DT
FROM DUAL
UNION ALL
SELECT TO_CHAR(ADD_MONTHS(TO_DATE(DT, 'YYYY-MM-DD'), 1), 'YYYY-MM-DD')
FROM DR
WHERE DT < TO_CHAR(SYSDATE, 'YYYY') || '-12-01'
)
SELECT
TO_CHAR(TO_DATE(M.DT, 'YYYY-MM-DD'), 'YYYYMM') AS YM,
TO_CHAR(TO_DATE(M.DT, 'YYYY-MM-DD'), 'MM월') AS MM,
COALESCE(SS.CNT, 0) AS CNT,
COALESCE(SS.AMT, 0) AS AMT,
COALESCE(SS2.OP_ITEM_PS_AMT, 0) AS OP_ITEM_PS_AMT
FROM DR M
" (DT)를 추가해야하는 이유를 모르겠어요. "
" ORACLE WITH 절 옆에 ()로 DT 명칭을 입력해주어야 하는 이유가 궁금합니다."
Oracle에서 재귀 절을 사용할 때 WITH, 재귀 쿼리의 구조를 정의하기 위해 열 별칭을 명시적으로 지정해야 합니다. 이 요구 사항은 쿼리의 재귀 부분이 사용 중인 열을 적절하게 참조할 수 있도록 보장합니다.
간단히 설명하면 다음과 같습니다.
- 비재귀적 CTE : 재귀적이지 않은 공통 테이블 표현식(CTE)을 정의하는 경우 하위 쿼리에서 유추할 수 있는 경우에는 반드시 열 별칭을 지정할 필요가 없습니다.
- 재귀적 CTE : 재귀적 CTE를 정의할 때 Oracle은 열 별칭을 명시적으로 나열하도록 요구합니다. 이를 통해 Oracle은 CTE의 앵커 및 재귀적 멤버에 대한 열 이름과 순서를 이해하는 데 도움이 됩니다.
"그럼 WITH절로 가상의 테이블을 만드는데, 테이블 명은 DR이고, 컬럼 명이 DT라고 이해하면 될까요"
네, 맞습니다. WITH절재귀 CTE의 WITH 절을 다음과 같이 설명할 수 있습니다.
WITH 절의 기본 개념
WITH 절은 **Common Table Expression(CTE)**를 정의합니다. CTE는 일시적인 가상의 테이블로, 쿼리에서 재사용할 수 있는 데이터 집합을 만듭니다. CTE는 복잡한 쿼리를 더 간결하고 읽기 쉽게 만들 수 있습니다.
WITH 절의 구문과 구성 요소
WITH <CTE_NAME> (column1, column2, ...)
AS (
-- CTE 정의
SELECT ... FROM ...
UNION ALL
SELECT ... FROM <CTE_NAME> WHERE ...
)
SELECT * FROM <CTE_NAME>;
Oracle 공식 문서 - WITH 절의 사용법
https://docs.oracle.com/en/database/oracle/oracle-database/19/sqlrf/with.html
Oracle 공식 문서 - CTE의 기본 개념
Oracle 공식 문서 - 재귀 CTE의 사용법
728x90
반응형