with 절 에러 발생 질문. 0 7 3,984

by 삑사리통 [Oracle 기초] [2020.08.11 12:07:38]


안녕하세요.

오늘도 열심히 일하는 초보 개발자 입니다.

다름이 아니라 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 아래부분을 주석처리하면 전체적인 쿼리는 돌아갑니다.

인터넷을 찾아봐도 해결방법이 보이지 않아 해결할 수 있는 방안 조언 해주시면 감사하겠습니다.

 

by 우리집아찌 [2020.08.11 16:03:32]

알리아스 문제 같은데요.


by 삑사리통 [2020.08.11 16:32:34]

네 알리아스 문제인거 같아서 DT, DAYOFWEEK, WEEK 세개를 명확하게 똑같이 했는데도 에러가 나네요ㅠ


by 우리집아찌 [2020.08.11 16:36:51]

WITH DT_TABLE(DT, DAYOFWEEK, WEEK) AS <=  (DT, DAYOFWEEK, WEEK) 를 뺴보세요.. 이게 아마 오라클 버젼에 따라 안되는것도 있을겁니다.


by 삑사리통 [2020.08.11 16:54:19]

아,,,,, 뺐는데도 안되네요,,,,ㅠ


by pajama [2020.08.11 23:50:58]

WITH문장의 임시테이블 말고 DT_TABLE이 실제로 생성되어 있는건 아닌지요?

테이블 명을 바꿔보시면 어떤가요?


by 마농 [2020.08.14 13:26:42]

버전은 확인하셨나요? 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
;

 


by 삑사리통 [2020.09.10 11:19:52]

답변 주신 분들 모두 감사합니다.

짜여진 쿼리에서 에러 원인을 찾아내지 못하고 마농님께서 알려주신 쿼리 참조하여 수정했습니다.

감사합니다.

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입