decode에 대해서 질문드립니다. 0 2 2,615

by 파카군 [SQL Query] decode [2014.07.25 17:38:49]


select

decode(

select * from (select s.rsrt_docu_mng_no from sec_use_req_list s where s.rsrt_docu_mng_no = a.docu_mng_no and s.docu_seq = a.docu_seq order by rgst_dtime desc) AA where rownum = 1)

, a.docu_mng_no

,'true'

,'false')  as test

from adm_conf_mng_book a

, com_pdoc_by_docu c

where 1=1

and a.docu_seq  = b.docu_seq

위와같이 코드를짜면 A.DOCU_SEQ 부적합한 식별자(ORA 00904)가 발생합니다.

A는 확실히 해당 컬럼을 가지고 있고 a. <-을 삭제하면 되긴합니다만

false로 빠지게 되더라구요.. true값이 나오도록 값은 세팅되어 있구요..

 

어떤 방법을 사용하면 A.docu_seq를 사용할 수 있을까요? 

 

어려운 질문드려서 정말 죄송합니다..

by 마농 [2014.07.25 17:57:44]

"Decode(" 에서 괄호가 부족해 보이는데요? "Decode(("
마지막 조건의 "b.docu_seq" 도 이상한데...
요것들은 단순 오타 나신거라 생각하고 패스..


- 원인 : 서브쿼리에서 메인항목을 조건으로 줄때 2Depth 이하로 못들어 갑니다.
- 해결 : 논리적으로 풀어야 합니다.
진자 2Depth 로 들어가야만 하는가?
rgst_dtime 역순으로 정렬후 s.rsrt_docu_mng_no 을 가져왔으나?
s.rsrt_docu_mng_no 은 어차피 (s.rsrt_docu_mng_no = a.docu_mng_no) 조건에 의해
a.docu_mng_no 와 같을 수밖에 없고...
(rownum = 1)에 의해 1건을 가져와 a.docu_mng_no 랑 비교하는데
이미 같은 걸 가져왔으므로 데이터가 존재한다면 같은건 당연지사..
따라서 정렬도 필요 없고 s.rsrt_docu_mng_no 도 필요 없고 오로지 존재여부만 판단하면 되는 상황

SELECT (SELECT NVL(MIN('true'), 'false')
          FROM sec_use_req_list s
         WHERE s.rsrt_docu_mng_no = a.docu_mng_no
           AND s.docu_seq         = a.docu_seq
           AND ROWNUM = 1
        ) AS test
  FROM adm_conf_mng_book a
     , com_pdoc_by_docu  c
 WHERE 1=1
   AND a.docu_seq = c.docu_seq
;

 


by 파카군 [2014.07.25 18:12:09]

감사합니다. 말씀주신대로 하니까 잘됩니다!! 감사합니다!!

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