쿼리 질문 드립니다 0 14 848

by naverTT [2018.03.16 13:43:16]


A 라는 테이블이 게시글 마스터테이블이고, B가 게시글에 대한 옵션정보인데

B에 있는 컬럼을 가지고 A의 값을 업데이트 중에 있습니다

 

select
 ADD_MONTHS(update_date, (select TO_NUMBER(CLOSE_TERM) from wo00066.tbo2020 where a1.bulletincode = bulletincode
and a1.threadno = threadno)*12) - 1 closedate_new
, update_date
, closedate
, a1.*
 from wo00066.tbo2010 a1
where not exists (select 1 from WO00066.TBO2020 a2 where
a1.bulletincode = a2.bulletincode
and a1.threadno = a2.threadno
and close_term not in ('0','9')
and rownum = 1)
and closedate > sysdate
;

여기서 나오는 closedate_new 값을 TBO2010에 CLOSEDATE 값으로 업데이트 해주어야 하는데

TBO2020에 NOT IN 조건 때문에

TBO2020에서 누락된 건에 대해서 TBO2010에 빈 값이 업데이트 쳐지는 문제가 발생합니다

어떻게 조인을 걸어서 업데이트를 해야하나요ㅠ

 

by 마농 [2018.03.16 14:17:11]

Update 할 때 Where 절 누락하신 듯?


by naverTT [2018.03.16 14:20:30]

update tbo2010 b1 set closedate = (
select closedate_new
from
(
select ADD_MONTHS(update_date, (select TO_NUMBER(CLOSE_TERM) from wo00066.tbo2020 where a1.bulletincode = bulletincode
and a1.threadno = threadno)*12) - 1 closedate_new
, update_date
, closedate
, a1.bulletincode
, a1.threadno
 from wo00066.tbo2010 a1
where not exists (select 1 from WO00066.TBO2020 a2 where
a1.bulletincode = a2.bulletincode
and a1.threadno = a2.threadno
and a2.close_term not in ('0','9')
and rownum = 1)
and closedate > sysdate) t where t.bulletincode = b1.bulletincode and t.threadno = b1.threadno)
where (bulletincode, threadno) in  (select bulletincode, threadno from tbo2020 where close_term not in ('0','9'))

 

ㅇㅣ렇게 하였는데도 빈값이 발생합니다ㅠㅠㅠ


by 마농 [2018.03.16 14:46:48]

select 절의 조건문과 Update 문의 조건문이 서로 달라 보입니다.
또한 동일 Select 구문 또는 동일 Update 구문 내에서의
메인 쿼리 조건절과 서브쿼리 조건절도 달라 보입니다.
일관성이 없네요.
쿼리도 너무 인라인뷰가 깊이 들어가는 경향도 있구요.
정확한 조건에 대해 상세히 설명해 주세요.
a 와 b 의 관계는 1:1 인가요? 1:다 인가요?


by naverTT [2018.03.16 14:51:09]

a와 b의 관계는 1:1입니다.

NOT IN 조건때문에 A 의 데이터 양 > B의 데이터 양 인 상황입니다.

같은 조건을 UPDATE 에도 넣어주어야 하나요?


by 마농 [2018.03.16 14:58:37]

무엇을 어떻게 갱신할 것인지만 명확하게 설명해 주시면 됩니다.


by naverTT [2018.03.16 15:05:33]

TBO2020에 CLOSE_TERM을 이용하여

TBO2010에 CLOSEDATE를 업데이트 할 것입니다.

 

 


by 마농 [2018.03.16 15:07:03]
-- 0. 모든 조건절을 일치시켜 주세요. --
-- 1. 확인용 --
SELECT update_date
     , closedate
--   , (SELECT ADD_MONTHS(a.update_date, b.close_term) * 12 - 1  -- 오류
     , (SELECT ADD_MONTHS(a.update_date, b.close_term * 12) - 1  -- 수정
          FROM tbo2020 b
         WHERE b.bulletincode = a.bulletincode
           AND b.threadno     = a.threadno
           AND b.close_term NOT IN ('0','9')
        ) closedate_new
  FROM tbo2010 a
 WHERE EXISTS (SELECT 0
                 FROM tbo2020 b
                WHERE b.bulletincode = a.bulletincode
                  AND b.threadno     = a.threadno
                  AND b.close_term NOT IN ('0','9')
               )
;
-- 2. 갱신용 --
UPDATE tbo2010 a
   SET closedate
--   = (SELECT ADD_MONTHS(a.update_date, b.close_term) * 12 - 1  -- 오류
     = (SELECT ADD_MONTHS(a.update_date, b.close_term * 12) - 1  -- 수정
          FROM tbo2020 b
         WHERE b.bulletincode = a.bulletincode
           AND b.threadno     = a.threadno
           AND b.close_term NOT IN ('0','9')
        )
 WHERE EXISTS (SELECT 0
                 FROM tbo2020 b
                WHERE b.bulletincode = a.bulletincode
                  AND b.threadno     = a.threadno
                  AND b.close_term NOT IN ('0','9')
               )
;

 


by naverTT [2018.03.16 15:28:11]

의견 감사합니다~!
 

그런데 CLOSE_TERM 이 CHAR(1) 이라서 TO_NUMBER 를 해주었는데도

ORA-00932: 일관성 없는 데이터 유형: NUMBER이(가) 필요하지만 DATE임

오류가 떨어집니다 ㅠㅠ

 


by 마농 [2018.03.16 15:34:00]
-- 자료 확인하세요. 
SELECT DISTINCT close_term FROM tbo2020;
-- ' ' 이나 'a' 와 같은 오류 자료가 확인되면, 조건절에 추가해 주세요.
   AND b.close_term NOT IN ('0', '9', ' ', 'a')
-- 아예 IN 절로 바꿔도 되겠네요.
   AND b.close_term IN ('1', '2', '3', '4', '5', '6', '7', '8')

 


by naverTT [2018.03.16 16:05:47]

0.1.2.3.4.5.9 의 값만 들어갈 수 있는데

' ' 빈값인건 삭제를 했음에도 같은 오류가 발생합니다ㅜㅜ

 


by 마농 [2018.03.16 16:44:10]

1. 0.1.2.3.4.5.9 의 값만 들어갈 수 있는데...
  - 실제로 그런지 확인해 보세요.
2. IN ('1', '2', '3', '4', '5') 로 해도 에러 난다면?
  - 혹시 closedate 가 number 형인가요?


by naverTT [2018.03.16 16:45:43]

closedate는 date 입니다 ㅠㅠ

 

SELECT update_date
     , closedate
     , (SELECT ADD_MONTHS(a.update_date, to_number(b.close_term)) * 12 - 1
          FROM tbo2020 b
         WHERE b.bulletincode = a.bulletincode
           AND b.threadno     = a.threadno
           AND b.close_term NOT IN ('0','9')
        ) closedate_new
  FROM tbo2010 a
 WHERE EXISTS (SELECT 0
                 FROM tbo2020 b
                WHERE b.bulletincode = a.bulletincode
                  AND b.threadno     = a.threadno
                  AND b.close_term NOT IN ('0','9')
               )
;
 

 

이렇게 to_number로 감쌋는데도 ㅠㅠ


by 마농 [2018.03.16 16:59:18]

아! 죄송합니다. 제가 실수 했네요... ( * 12 - 1 ) 의 위치가 틀렸네요.
 - 오류 : ADD_MONTHS(a.update_date, b.close_term) * 12 - 1
 - 수정 : ADD_MONTHS(a.update_date, b.close_term * 12) - 1


by naverTT [2018.03.16 17:09:19]

아.. 제가 짠거에서는 ) 이게잇어서 전혀 생각을 안했네요 ㅠㅠ

 

의견 정말 감사합니다!!

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