일괄 UPDATE 질문드립니다. 0 12 4,184

by 클라나드 [SQL Query] UPDATE [2013.09.03 14:49:24]


SELECT B.WMS_CLHADT, B.WMS_CLHA_CLASS, C.ORDER_STATUS
FROM EM_HMNW_RECIPT_HIS_TEST A, EM_ORDER_DETAIL_TEST B, EM_ORDER_GOODS_TEST C
WHERE B.WMS_CLHADT = TO_DATE ('20130902', 'YYYYMMDD')
AND (A.ORD_NUM = B.ORD_NUM AND A.GOODS_ID = B.GOODS_ID AND A.ORD_DEAL_SEQ = B.GOODS_SEQNO)
AND (A.ORD_NUM = C.ORD_NUM AND A.GOODS_ID = C.GOODS_ID AND A.ORD_DEAL_SEQ = C.ORD_DEAL_SEQ)
셀렉트 하면 967건의 데이터 가 나오는데요 세개의 컬럼을 업데이트 하려고 합니다. B.WMS_CLHADT = '' B.WMS_CLHA_CLASS = '' C.ORDER_STATUS = '10' 으로 업데이트하려는데요 고수님들의 조언부탁드립니다^^
도와주세요 (__);







UPDATE EM_ORDER_GOODS_TEST
SET ORDER_STATUS = '77'
WHERE ORD_NUM IN 
(
SELECT A.ORD_NUM
FROM EM_HMNW_RECIPT_HIS_TEST A, EM_ORDER_DETAIL_TEST B, EM_ORDER_GOODS_TEST C
WHERE B.WMS_CLHADT = TO_DATE ('20130902', 'YYYYMMDD')
AND (A.ORD_NUM = B.ORD_NUM AND A.GOODS_ID = B.GOODS_ID AND A.ORD_DEAL_SEQ = B.GOODS_SEQNO)
AND (A.ORD_NUM = C.ORD_NUM AND A.GOODS_ID = C.GOODS_ID AND A.ORD_DEAL_SEQ = C.ORD_DEAL_SEQ)
)
AND GOODS_ID IN 
(
SELECT A.GOODS_ID
FROM EM_HMNW_RECIPT_HIS_TEST A, EM_ORDER_DETAIL_TEST B, EM_ORDER_GOODS_TEST C
WHERE B.WMS_CLHADT = TO_DATE ('20130902', 'YYYYMMDD')
AND (A.ORD_NUM = B.ORD_NUM AND A.GOODS_ID = B.GOODS_ID AND A.ORD_DEAL_SEQ = B.GOODS_SEQNO)
AND (A.ORD_NUM = C.ORD_NUM AND A.GOODS_ID = C.GOODS_ID AND A.ORD_DEAL_SEQ = C.ORD_DEAL_SEQ)
)
AND ORD_DEAL_SEQ IN 
(
SELECT A.ORD_DEAL_SEQ
FROM EM_HMNW_RECIPT_HIS_TEST A, EM_ORDER_DETAIL_TEST B, EM_ORDER_GOODS_TEST C
WHERE B.WMS_CLHADT = TO_DATE ('20130902', 'YYYYMMDD')
AND (A.ORD_NUM = B.ORD_NUM AND A.GOODS_ID = B.GOODS_ID AND A.ORD_DEAL_SEQ = B.GOODS_SEQNO)
AND (A.ORD_NUM = C.ORD_NUM AND A.GOODS_ID = C.GOODS_ID AND A.ORD_DEAL_SEQ = C.ORD_DEAL_SEQ)
)


요렇게하니까 
968건이 업데이트되네요 ㅠㅠ
뭔가잘못하고있는거죠..
by 아발란체 [2013.09.03 15:06:58]
오라클은 Multi-Table Inserts만 지원합니다.
Multi-Table Update(1개 이상 테이블)은 지원하지 않습니다.
즉 업데이트 구문 2번 실행하여 2개 테이블 업데이트 해야 합니다.

by 클라나드 [2013.09.03 15:08:29]
네 2번실행해야합니다.
어떻게 2번실행해야할지를 몰라서요 힝

by 아발란체 [2013.09.03 15:11:07]

억 업데이트 항목이 1개네요,  항목 3개에 대상 테이블 2개로 봤습니다.


by 클라나드 [2013.09.03 15:19:48]
업데이트항목은 3개가 맞습니다.
예시로 C 테이블꺼 업데이트 하나만 한거구요
C테이블꺼만 업데이트 되면 B테이블에 2개는 똑같은방법으로 하면
되니까요^^

by 아발란체 [2013.09.03 15:15:45]

내용 수정하여 업데이트 구문 올려주셨는데,
여기서 EM_ORDER_GOODS_TEST 요 테이블은 갑작이 왜 나오나요? ㅋㅋ

위에 내용과 일관성 있는 테이블 정보를 주셔야 왜 업데이트 건수가 늘었나 확인할 수 있습니다.
새로운 테이블은 구조와 데이타 내용을 모르기 때문에 왜 업데이트 건수가 늘었나 알 수 없습니다. ^^;


by 아발란체 [2013.09.03 15:20:18]
억... 또 수정되었다...

by 클라나드 [2013.09.03 15:20:46]
실테이블에 업데이트 하면 안될거같아서 세개의 테이블에
_TEST를 붙여서 테이블을 복사해서 만들고 테스트하였습니다.
질문에 혼동을 드려 죄송합니다.. ㅠㅠ

by 아발란체 [2013.09.03 15:31:03]
맨위 질의 올려주신

SELECT B.WMS_CLHADT, B.WMS_CLHA_CLASS, C.ORDER_STATUS

FROM EM_HMNW_RECIPT_HIS_TEST A, EM_ORDER_DETAIL_TEST B, EM_ORDER_GOODS_TEST C

WHERE B.WMS_CLHADT = TO_DATE ('20130902', 'YYYYMMDD')

AND (A.ORD_NUM = B.ORD_NUM AND A.GOODS_ID = B.GOODS_ID AND A.ORD_DEAL_SEQ = B.GOODS_SEQNO)

AND (A.ORD_NUM = C.ORD_NUM AND A.GOODS_ID = C.GOODS_ID AND A.ORD_DEAL_SEQ = C.ORD_DEAL_SEQ)

요게 967건 뜬고 업데이트 967건 되어야 한다면.
일단 C는 다음과 같이 하시면 될거 같습니다.

update
 EM_ORDER_GOODS_TEST c
set
 ORDER_STATUS = '10'
where exists(
 select
	 1
 from
	 EM_HMNW_RECIPT_HIS_TEST A,
	 EM_ORDER_DETAIL_TEST B
 where
	 B.WMS_CLHADT = TO_DATE ('20130902', 'YYYYMMDD')
	 AND (A.ORD_NUM = B.ORD_NUM AND A.GOODS_ID = B.GOODS_ID AND A.ORD_DEAL_SEQ = B.GOODS_SEQNO)
	 AND (A.ORD_NUM = C.ORD_NUM AND A.GOODS_ID = C.GOODS_ID AND A.ORD_DEAL_SEQ = C.ORD_DEAL_SEQ)
 );


B는 말씀주신 것처럼 바꿔쓰시면 될거 같아용.

by 클라나드 [2013.09.03 15:50:16]
update
 EM_ORDER_GOODS_TEST c
set
 ORDER_STATUS = '99'
where exists(
 select
  1
 from
  EM_HMNW_RECIPT_HIS_TEST A,
  EM_ORDER_DETAIL_TEST B
 where
  B.WMS_CLHADT = TO_DATE ('20130902', 'YYYYMMDD')
  AND (A.ORD_NUM = B.ORD_NUM AND A.GOODS_ID = B.GOODS_ID AND A.ORD_DEAL_SEQ = B.GOODS_SEQNO)
  AND (A.ORD_NUM = C.ORD_NUM AND A.GOODS_ID = C.GOODS_ID AND A.ORD_DEAL_SEQ = C.ORD_DEAL_SEQ)
 );
하면 5분이 지나도 업데이트가안되네요
update
 EM_ORDER_GOODS_TEST c
set
 ORDER_STATUS = '57'
where exists(
SELECT 1
FROM EM_HMNW_RECIPT_HIS_TEST A, EM_ORDER_DETAIL_TEST B, EM_ORDER_GOODS_TEST C
WHERE B.WMS_CLHADT = TO_DATE ('20130902', 'YYYYMMDD')
AND (A.ORD_NUM = B.ORD_NUM AND A.GOODS_ID = B.GOODS_ID AND A.ORD_DEAL_SEQ = B.GOODS_SEQNO)
AND (A.ORD_NUM = C.ORD_NUM AND A.GOODS_ID = C.GOODS_ID AND A.ORD_DEAL_SEQ = C.ORD_DEAL_SEQ)
 );
으로하니까 12만건이 업데이트되네요 ㅠㅠ

by 마농 [2013.09.03 16:00:39]

하면 5분이 지나도 업데이트가안되네요
  ==> 테스트 테이블 만들면서 인덱스는 안만들었겠죠. 인덱스를 만드세요.
으로하니까 12만건이 업데이트되네요 ㅠㅠ
  ==> 이렇게 하는 방법은 틀린 방법입니다.

그리고 a IN (SELECT a) AND b IN (SELECT b) AND c IN (SELECT c) 는 틀린방법입니다.
(a, b, c) IN (SELECT a, b, c) 하셔야 맞습니다.


by 클라나드 [2013.09.03 16:19:23]
-- ORDER_STATUS = '' 업데이트 쿼리
UPDATE EM_ORDER_GOODS
SET ORDER_STATUS = '18'
WHERE 1=1
AND (ORD_NUM, GOODS_ID, ORD_DEAL_SEQ) IN 
(
SELECT C.ORD_NUM, C.GOODS_ID, C.ORD_DEAL_SEQ
FROM EM_HMNW_RECIPT_HIS A, EM_ORDER_DETAIL B, EM_ORDER_GOODS C
WHERE B.WMS_CLHADT = TO_DATE ('20130902', 'YYYYMMDD')
AND (A.ORD_NUM = B.ORD_NUM AND A.GOODS_ID = B.GOODS_ID AND A.ORD_DEAL_SEQ = B.GOODS_SEQNO)
AND (A.ORD_NUM = C.ORD_NUM AND A.GOODS_ID = C.GOODS_ID AND A.ORD_DEAL_SEQ = C.ORD_DEAL_SEQ)
)
-- WMS_CLHA_CLASS = '', WMS_CLHADT = '' 업데이트쿼리
UPDATE EM_ORDER_DETAIL
SET WMS_CLHA_CLASS = '', WMS_CLHADT = ''
WHERE 1=1
AND (ORD_NUM, GOODS_ID, GOODS_SEQNO) IN 
(
SELECT C.ORD_NUM, C.GOODS_ID, C.ORD_DEAL_SEQ
FROM EM_HMNW_RECIPT_HIS A, EM_ORDER_DETAIL B, EM_ORDER_GOODS C
WHERE B.WMS_CLHADT = TO_DATE ('20130902', 'YYYYMMDD')
AND (A.ORD_NUM = B.ORD_NUM AND A.GOODS_ID = B.GOODS_ID AND A.ORD_DEAL_SEQ = B.GOODS_SEQNO)
AND (A.ORD_NUM = C.ORD_NUM AND A.GOODS_ID = C.GOODS_ID AND A.ORD_DEAL_SEQ = C.ORD_DEAL_SEQ)
)

이렇게 해결하였습니다.
매우매우 감사합니다. 
그런데 마농님께서 인덱스 만들라구 하셧는데
인덱스 무었인가요?
테이블 인덱스 만들기로 검색해도 안나와서 질문드립니다(__)

by 아린 [2013.09.03 16:28:02]
http://www.gurubee.net/lecture/1035
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입