업데이트 문장 중에서 인라인뷰형식.. 그 형식으로 update하는 이유... 0 2 6,106

by 공기 [Oracle 기초] [2018.05.09 16:11:56]


UPDATE
          ( SELECT   A.CUST_NO, A.JOB_NO
             FROM   AAAA  A   
                       , BBBB   B    
              WHERE  A.CUST_NO = B.CUST_NO
           ) 

SET   A.JOB_NO = '00000'

이런형식의  업데이트 문장을 쓰는 이유는,  평범한 update문장으로는 성능이 안나와서 이겠죠??

그거외에는 굳이  한눈에 안들어오게  저렇게 짤 필요가 없는거죠?

(대용량 테이블 경우인듯...)

.

by 마농 [2018.05.14 15:28:02]

뷰에 대한 업데이트 쿼리네요.
이를 일반 서브쿼리 형식의 업데이트 쿼리로 바꿔보면
IN 또는 EXISTS 서브쿼리를 이용할 수 있는데요.

UPDATE aaaa a
   SET a.job_no = '00000'
 WHERE a.cust_no IN (SELECT b.cust_no FROM bbbb b)
;
UPDATE aaaa a
   SET a.job_no = '00000'
 WHERE EXISTS (SELECT 0 FROM bbbb b WHERE b.cust_no = a.cust_no)
;

서브쿼리 보다는 조인이 일반적으로 더 성능상 좋구요.
위 쿼리는 상수값으로 업데이트를 하고 있지만
보통 b의 컬럼값으로 업데이트 하는 경우가 더 많죠.

UPDATE aaaa a
   SET a.job_no = (SELECT b.job_no FROM bbbb b WHERE b.cust_no = a.cust_no)
 WHERE EXISTS (SELECT 0 FROM bbbb b WHERE b.cust_no = a.cust_no)
;

이 경우엔 동일한 서브쿼리를 두번(set 절, where 절) 사용해야 합니다. 불합리하죠.
다른 DB(MSSQL, MySQL)은 인라인뷰를 사용하지 않고도 조인 업데이트가 가능한데요.
오라클은 이게 불가능합니다.
그래서 조인뷰를 이용한 업데이트를 사용하기도 합니다.
요즘은 서브쿼리를 이용한 업데이트가 속도가 안날 때 머지문을 쓰기도 합니다.
 

MERGE INTO aaaa a
USING bbbb b
ON (a.cust_no = b.cust_no)
WHEN MATCHED THEN
UPDATE SET a.job_no = b.job_no
;

http://gurubee.net/article/79308


by 공기 [2018.05.17 10:35:21]

아이고~ 자세한 답변 감사합니다.

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