database.sarang.net
UserID
Passwd
Database
DBMS
MySQL
PostgreSQL
Firebird
ㆍOracle
Informix
Sybase
MS-SQL
DB2
Cache
CUBRID
LDAP
ALTIBASE
Tibero
DB 문서들
스터디
Community
공지사항
자유게시판
구인|구직
DSN 갤러리
도움주신분들
Admin
운영게시판
최근게시물
Oracle Q&A 40707 게시물 읽기
No. 40707
update 문 도와주세요
작성자
편두통
작성일
2015-02-02 17:28ⓒ
2015-02-02 17:31ⓜ
조회수
8,632

< table A >

*COL1 *COL2 COL3
과일 딸기 C
과일 포도 (null)
과일 (null)
... ... ...

 

< view B >

COL1 COL2
과일 딸기
과일 딸기
과일 사과
과일
... ...

 

UPDATE 문에 대해 문의드립니다.

- A 는 Table. (PK : COL1, COL2)
- B 는 View이고 데이터 중복 가능
- B 데이터를 참조하여 A 테이블의 COL3 값 Update
; A의 COL3 컬럼 값이 (null) 인 값에 대해 update
; A(테이블)의 COL1, COL2 값이 B(뷰)에 있으면 COL3 = 'C'
; A(테이블)의 COL1, COL2 값이 B(뷰)에 없으면 COL3 = 'D'
; A(테이블)의 Update 대상이 되는 Row 수는 6600건, A(테이블) 총 Row 수는 70만 건.
B(뷰)의 데이터 수는 총 150만건으로 update 속도 고려

 

아무리 머리를 쥐어짜내도 모르겠네요;;
기껏 짜낸 sql 문은 에러만 내구요ㅜㅜ

마농님을 비롯한 많은 고수님들의 도움 부탁드립니다.

이 글에 대한 댓글이 총 2건 있습니다.

자문 자답 입니다만,
이렇게 해도 될까요?
Update 된 Row 수랑 결과는 맞는거 같은데...

이렇게 해도 될까요? 아니면 다른 방법도 있나요?

------------------------------------------------------------------------------------------------------------------------------------

UPDATE A AA

SET AA.COL3 = (SELECT DISTINCT CASE WHEN B.COL2 IS NULL

                                                                              THEN 'D'

                                                                              ELSE 'C'

                                                                     END COL3

                                      FROM B,

                                                   (SELECT COL1, COL2, COL3 FROM A WHERE 1=1 AND COL3 IS NULL) A

                                     WHERE 1=1

                                            AND A.COL1 = B.COL1(+)

                                            AND A.COL2 = B.COL2(+)

                                            AND A.COL1 = AA.COL1

                                            AND A.COL2 = AA.COL2

                                            AND A.COL3 IS NULL)

WHERE AA.COL3 IS NULL

AND EXISTS (SELECT ' '

                              FROM B,

                                          (SELECT COL1, COL2, COL3 FROM A WHERE 1=1  AND COL3 IS NULL) A

                          WHERE 1=1

                                AND A.COL1 = B.COL1(+)

                                AND A.COL2 = B.COL2(+)

                                AND A.COL1 = AA.COL1

                                AND A.COL1 = AA.COL2

                                AND A.COL3 IS NULL)

;

편두통님이 2015-02-02 18:04에 작성한 댓글입니다. Edit

해당 뷰의 조건항목 col1, col2 에 인덱스가 있는지 모르겠네요.
인덱스를 이용할 수 있어야만 합니다.


UPDATE a
   SET col3 = (SELECT NVL(MIN('C'), 'D')
                 FROM b
                WHERE b.col1 = a.col1
                  AND b.col2 = a.col2
                  AND ROWNUM = 1
               )
 WHERE col3 IS NULL
;


이 스칼라서브쿼리 방식의 경우 인덱스가 없다면 치명적입니다.
  - 150만건 풀스캔을 6600번 반복 수행
이 경우엔 조인 결과를 이용하여 Merge 하는 방법이 좋겠네요.


MERGE INTO a
USING
(
SELECT a.col1, a.col2
     , DECODE(COUNT(b.col1), 0, 'D', 'C') col3
  FROM a
     , b
 WHERE a.col1 = b.col1(+)
   AND a.col2 = b.col2(+)
   AND a.col3 IS NULL
 GROUP BY a.col1, a.col2
) b
ON (a.col1 = b.col1 AND a.col2 = b.col2)
WHEN MATCHED THEN
UPDATE SET col3 = b.col3
;

마농(manon94)님이 2015-02-04 14:58에 작성한 댓글입니다.
[Top]
No.
제목
작성자
작성일
조회
40710plsql command window에서 프로시져 컴파일 시 & 문자 무시하고 컴파일 시키는 명령어가 있죠? [1]
궁금이
2015-02-06
7071
40709FULL OUTER JOIN 시 토드에선 돌아가는데 운영할땐 오류가 나서요.. [8]
디비잘하고싶다
2015-02-05
8525
40708자동 Row생성 [3]
카이백작
2015-02-04
8207
40707update 문 도와주세요 [2]
편두통
2015-02-02
8632
40706문자열 자르기 쿼리 관련 문의 [5]
돈방석
2015-02-02
7768
40705소수점 데이터가 있는지 확인 하는 방법 [3]
나루토21
2015-02-02
9848
407047일 연속 로그인한 고객데이터 뽑는 쿼리 부탁 드립니다. [2]
사바직자
2015-02-02
8109
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.023초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다