반응형

오라클 다중 업데이트 입니다.


두 테이블을 조인해서 업데이트를 하는 방법에는 두가지가 있는데 예제를 통해서 확인해 봅시다.


1. 일단 테이블을 생성합니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

create table 사람
  사람이름 varchar2(200),
  계급 varchar2(200),
  constraint pk_사람 primary key(사람이름)
);
 
create table 재산
  사람이름 varchar2(200),
  재산이름 varchar2(200),
  constraint pk_재산 primary key(사람이름, 재산이름)
);
 
cs


2.  적당한 데이터를 넣고


1
2
3
4
5
6
7
8
9
insert into 사람 (사람이름) values ('임꺽정');
insert into 사람 (사람이름) values ('홍길동');
insert into 사람 (사람이름) values ('김선달');
 
insert into 재산( 사람이름, 재산이름) values('임꺽정''자전거');
insert into 재산 (사람이름, 재산이름) values('홍길동''자동차');
insert into 재산 (사람이름, 재산이름) values('김선달''자전거');
insert into 재산 (사람이름, 재산이름) values('김선달''자동차');
insert into 재산 (사람이름, 재산이름) values('김선달''집');
cs



3. 첫번째 멀티 조인 업데이트 입니다. 업데이트 절에서 조인하고 set 절에서 조인한 컬럼 끼리 매칭 시켜주면 됩니다.


1
2
3
4
5
6
7
UPDATE (
  SELECT a.계급 before, 
         '부자' AS after
    FROM 사람 a INNER JOIN 재산 b ON a.사람이름 = b.사람이름
   WHERE b.재산이름 = '집'
) t
SET t.before = t.after;
cs


* 이 때 ORA-01779 키보존 오류가 날 수 있는데, b.사람이름=pk 를 만족해야 합니다. 만약 multi pk 라 하더라도 모두 명시해주시면 됩니다.



4. 두번째 멀티 조인 업데이트 입니다. 보통의 업데이트 구문처럼 사용하면서 SET 절과 WHERE 절에 각각 서브쿼리를 통해 조인을 합니다.


1
2
3
4
UPDATE 사람 a
   SET a.계급 = (SELECT '평민' FROM 재산 b WHERE a.사람이름 = b.사람이름 AND b.재산이름 = '자동차')
 WHERE a.계급 is null
   AND EXISTS (SELECT 1 FROM 재산 b WHERE a.사람이름 = b.사람이름 AND b.재산이름 = '자동차');
cs



5. 결과는 이렇습니다.

1
select * from 사람;
cs


사람이름계급
임꺽정(null)
홍길동평민
김선달부자


여기서 실행 및 테스트 해볼 수 있습니다.


http://sqlfiddle.com/#!4/6432f/4

반응형

+ Recent posts