Wednesday, September 30, 2009

[Oracle] Update시 WHERE 조건에서 SELECT할 수 있을까요?

[Oracle] Update시 WHERE 조건에서 SELECT할 수 있을까요?
원문 : Update시 WHERE 조건에서 SELECT할 수 있을까요?

이것은 내가 DSN에 질문한 것이다.

Update시 WHERE 조건에서 SELECT할 수 있을까요?

Oracle 9i 입니다.


테이블 TA와 TB가 있습니다. TA와 TB에는 모두 동일한 컬럼 C1, C2가 있습니다.

그리고 TA의 C0를 일정한 값 '0000' 으로 업데이트하려고 합니다.

헌데 조건이 있습니다. TA.C1과 TA.C2가 TB.C1, TB.C2와 같아야 하며, TB의 TB.C1 과 TB.C2를 가져오는 조건이 또 따로 있습니다.

즉, UPDATE의 SET 에서 TB에 있는 컬럼의 값을 사용하는 것이 아닙니다.

현재 제가하는 방법을 보여드리면,

SPOOL updatequery.sql

SELECT 'UPDATE TA SET C0=''0000'' WHERE C1='''||TB.C1||''' C2='''||TB.C2||''';'

FROM TA, TB

WHERE TA.C1=TB.C2 AND TA.C2=TB.C2

AND TB와 관련된 조건들...;

SPOOL OFF

뭐 이런식으로 해서 UPDATE 문장들을 뽑아낸다음에 다시 그걸 sqlplus @updatequery.sql 로 실행하고 COMMIT;합니다.
아무리봐도 뭔가 한방에 처리할 수 있는 방법이 있을 것 같은데요...
대체 이찌해야할까요?

도움 부탁드립니다.


감사합니다.
이 글에 대한 댓글이 총 4건 있습니다.

select ... for update ... 라는 쿼리가 있습니다..

select 후 자동으로 lock 을 걸고 update 합니다...

단일테이블에서 select 와 update 를 동시에 가능하게 하는 쿼리입니다.
이경환(babocom)님이 2005-09-20 16:18:25에 작성한 댓글입니다.
이 댓글은 2005-09-20 16:20:53에 마지막으로 수정되었습니다.

UPDATE ta a
SET a.c0 = '0000'
WHERE (a.c1, a.c2) IN (SELECT b.c1, b.c2
FROM tb b
WHERE b.c1 = a.c1 AND b.c2 = a.c2 and TB와 관련된 조건들 ... )
장진주(zozogirl)님이 2005-09-20 16:57:48에 작성한 댓글입니다.

바로 윗분의 문장과 같은 의미지만..

TA의 C1과 C2가 PK라면..

아래와 같은 문장도 가능합니다..

장점은 조인되는 테이블의 컬럼을 사용할 수 있다는 거죠..

또한 유리한 조건을 가진 테이블을 드라이브하기가 용이하겠죠..

수정가능한 조인뷰와 같은 이치입니다..

UPDATE (
SELECT TA.C1 C1
,TA.C2 C2
,TA.C0 C0
FROM TA, TB
WHERE TA.C1 = TB.C1
AND TA.C2 = TB.C2
AND TB와 관련된 조건들...
)
SET C0 = '0000'

M님이 2005-09-20 17:14:15에 작성한 댓글입니다.
이 댓글은 2005-09-20 17:15:31에 마지막으로 수정되었습니다. Edit X

감사합니다.

장진주(zozogirl)님의 손쉽게 쿼리로 해결하였습니다.

다른분들의 힌트도 새로운걸 알게 해주었습니다.

모두 큰도움이 되었습니다.

SELECT .. for UPDATE 같은 경우에는 이걸 찾아보느라 Expert One on One Oracle을 뒤져봤는데, 번역판은 색인이 잘안돼서 못찾고 원서를 찾아보니 색인에 바로 나오더군요..

흠.. 번역할때 색인도 모범적으로 따라줬으면 좋겠구만..

권남님이 2005-09-20 20:37:48에 작성한 댓글입니다. Edit X

No comments: