안녕하세요.
오늘도 열심히 일하는 초보 개발자 입니다.
다름이 아니라 with절에서 에러가 발생해서 질문을 드립니다.
일단 쿼리는 이런 형식입니다.
WITH DT_TABLE(DT, DAYOFWEEK, WEEK) AS
(SELECT TO_DATA('20200510', 'YYYY-MM-DD') AS DT,
TO_CHAR(TO_DATA('20200510', 'YYYY-MM-DD'), 'DY') AS DAYOFWEEK,
CASE WHEN....................................... END AS WEEK
FROM DUAL
UNION ALL
SELECT DT +1,
TO_CHAR(DT+1, 'DY') AS DAYOFWEEK,
CASE WHEN...................................END AS WEEK
FROM DT_TABLE
WHERE 1=1
AND DT+1 <= TO_DATE('20200810', 'YYYY-MM-DD')
),
DT_TABLE2 AS(SELECT TO_CHAR(DT, 'YYYY-MM-DD') AS DT,
DAYOFWEEK,
WEEK
FROM DT_TABLE)
, BASE AS (SELECT,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,)
, PC AS (SELECT,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,)
, AVG AS (SELECT,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,)
, RESULT AS (SELECT,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,)
SELECT,,,, FROM RESULT
이런식으로 짜져 있는데 각각의 임시테이블을 select 했을때는 다 조회가 됩니다.
EX) SELECT * FROM DT_TABLE;
하지만 전체적으로 쿼리를 실행시키면
ORA-32039: 순환 WITH 절에는 열 별칭 목록이 있어야 합니다.
이 에러가 발생하는데 뭐가 문제 인지 도통 모르겠습니다.
제 생각에 문제는 처음 DT_TABLE 에 UNION ALL 부분 같은데 UNION 아래부분을 주석처리하면 전체적인 쿼리는 돌아갑니다.
인터넷을 찾아봐도 해결방법이 보이지 않아 해결할 수 있는 방안 조언 해주시면 감사하겠습니다.
버전은 확인하셨나요? Recursive SQL 은 11G 부터 가능합니다.
오타는 확인하셨나요? TO_DATA
UNION ALL 의 각 항목의 타입이 일치해야 합니다.
Recursive SQL 에서의 date Type 사용은 아직까지 잘 안되는 것 같습니다.(버그?)
달력생성은 다음 방법으로도 가능합니다.
WITH dt_table AS ( SELECT sdt + LEVEL - 1 dt , TO_CHAR(sdt + LEVEL - 1, 'DY') dy FROM (SELECT TO_DATE('20200510', 'yyyymmdd') sdt, TO_DATE('20200810', 'yyyymmdd') edt FROM dual) CONNECT BY LEVEL <= edt - sdt + 1 ) SELECT * FROM dt_table ;