다중row select 후 일괄 update 질문 드립니다. 0 7 74,021

by 최성수 [SQL Query] join update bypass_ujvc [2012.05.02 09:59:25]



select 를 하면 row가 1개가 아닌 몇개가 출력됩니다.
그걸 update 실행해야 하는데 , 아래와 같이 하니
오라클 에러가 뜨네요.

sgl_edi02t 테이블에 있는 confirm_resno  값을 공백으로 처리하고,
confirm_ep_id 를 집어넣기 위해서  select 에서 값을 가져오는 쿼리입니다.

다중 row를 select 해서 update 치는 구문이 없을까요?
아시는 분 힌트 부탁드립니다.



SQL>
update sgl_edi02t a,
(select c.confirm_resno, d.jumin_no, c.confirm_ep_id, d.ep_id as ep_id
 from sgl_edi02t c, cdemplt1 d
 where c.edi_seq in ('201205020001') and c.confirm_resno = d.jumin_no
 ) x
set a.confirm_resno = ' ' and a.confirm_ep_id = x.ep_id
where a.edi_seq in ('201205020001') and a.confirm_resno = x.jumin_no

ORA-00971: missing SET keyword

by 느훼훼 [2012.05.02 10:11:47]

일단 테이블끼리 SELECT해서 조인을 하는 경우에 UPDATE문을 작성할 때 힌트를 써야합니다.
UPDATE /*+ bypass_ujvc */
이런식으로 써야하구요,
그리고 밑에 SET 구문에서 문법 틀렸네요.
set a.confirm_resno = ' ' and a.confirm_ep_id = x.ep_id
가 아니고
set a.confirm_resno = ' ' , a.confirm_ep_id = x.ep_id
로 하셔야 합니다.


by 최성수 [2012.05.02 10:33:01]


네...감사합니다.. 문법이 틀렸네요..^^;;  그런데 다시 해봐도 같은 오라클 오류가 뜹니다..
아직 원인을 못찾겠네요..;;

SQL>
update /*+ bypass_ujvc */ sgl_edi02t a,
(select c.confirm_resno, d.jumin_no, c.confirm_ep_id, d.ep_id as ep_id
 from sgl_edi02t c, cdemplt1 d
 where c.edi_seq in ('201205020001') and c.confirm_resno = d.jumin_no
 ) x
set a.confirm_resno = '' , a.confirm_ep_id = x.ep_id
where a.edi_seq in ('201205020001') and a.confirm_resno = x.jumin_no

ORA-00971: missing SET keyword



by 마농 [2012.05.02 11:40:35]
-- 1. 서브쿼리 이용 --
UPDATE sgl_edi02t a
   SET confirm_resno = ''
     , confirm_ep_id = (SELECT ep_id FROM cdemplt1 WHERE jumin_no = a.confirm_resno)
 WHERE edi_seq IN ('201205020001')
   AND EXISTS (SELECT 1 FROM cdemplt1 WHERE jumin_no = a.confirm_resno)
;
-- 2. Updatable Join View 이용 --
UPDATE /*+ bypass_ujvc */
(
SELECT c.confirm_resno, c.confirm_ep_id, d.ep_id
  FROM sgl_edi02t c, cdemplt1 d
 WHERE c.edi_seq IN ('201205020001')
   AND c.confirm_resno = d.jumin_no
)
SET confirm_resno = ''
  , confirm_ep_id = ep_id
;

by 최성수 [2012.05.02 13:30:34]

헉...마농님 두가지 방법을 모두 보여주시네요.. 감사드립니다.
제가 더 고민하고 했으면 답이 나왔을텐데, 좀 부끄러워 지네요...^^;
마농님, 느훼훼님 모두 고맙습니다.
좋은 하루 되십시오.

by 손님 [2016.05.27 13:27:18]
마농님이 대한민국 DB 지도자네요. 하하

by 빛나 [2018.10.31 11:41:22]

서브쿼리 이용하여 ms-sql  에서 하는 방법은 없나요?
ms-sql에서는

-- 1. 서브쿼리 이용 --

UPDATE sgl_edi02t a

   SET confirm_resno = ''

     , confirm_ep_id = (SELECT ep_id FROM cdemplt1 WHERE jumin_no = a.confirm_resno)

 WHERE edi_seq IN ('201205020001')

   AND EXISTS (SELECT 1 FROM cdemplt1 WHERE jumin_no = a.confirm_resno)

;

a.근처의 구문이 잘못되었습니다, WHERE 근처의 구문이 잘못되었습니다. 

라고 오류가 나네요.


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