업무상 A 테이블의 특정 row 전체 혹은 다수를 B 테이블로 UPDATE를 수행해야 할 경우
다수의 서브쿼리를 사용하는 다음과 같은 방법을 생각할 수 있습니다.
UPDATE B SET col1 = (SELECT col1 FROM A WHERE col1 = 1), col2 = (...), col3 = (...), ... WHERE col1 = 1; |
위와 같은 방법은 불필요한 서브쿼리가 많아 SQL이 복잡하게 되므로 다음과 같은 형태로 변경이 가능합니다.
UPDATE B SET (B.col1, B.col2, B.col3, ...) = (SELECT A.col1, A.col2, A.col3, ... FROM A WHERE A.col1 = B.col1) WHERE B.col1 = 1 |
예제는 다음과 같습니다.
1. 테이블 생성 및 데이터 INSERT
CREATE TABLE A (col1 INT PRIMARY KEY, col2 CHAR(1), col3 CHAR(1)); CREATE TABLE B (col1 INT PRIMARY KEY, col2 CHAR(1), col3 CHAR(1)); INSERT INTO a VALUES(1, '1', '1'); INSERT INTO a VALUES(2, '2', '2'); INSERT INTO a VALUES(3, '3', '3'); INSERT INTO a VALUES(4, '4', '4'); INSERT INTO a VALUES(5, '5', '5'); INSERT INTO b VALUES(1, 'A', 'A'); INSERT INTO b VALUES(2, 'A', 'A'); INSERT INTO b VALUES(3, 'A', 'A'); INSERT INTO b VALUES(4, 'A', 'A'); INSERT INTO b VALUES(5, 'A', 'A'); |
2. A 와 B 테이블 조회
csql> select * from a; col1 col2 col3 ========================================================= 1 '1' '1' 2 '2' '2' 3 '3' '3' 4 '4' '4' 5 '5' '5' csql> select * from b; col1 col2 col3 ========================================================= 1 'A' 'A' 2 'A' 'A' 3 'A' 'A' 4 'A' 'A' 5 'A' 'A' |
3. B 테이블의 첫 번째 row를 모두 A의 첫 번째 로우로 UPDATE
UPDATE B SET (B.col2, B.col3) = (SELECT A.col2, A.col3 FROM A WHERE A.col1 = B.col1) WHERE B.col1 = 1; |
4. UPDATE 결과 확인
csql> select * from b; col1 col2 col3 ========================================================= 1 '1' '1' 2 'A' 'A' 3 'A' 'A' 4 'A' 'A' 5 'A' 'A' |