오라클을 주로 사용하던 이들은 다른 DBMS에서 아쉬운 것들이 몇가지 있죠. 현재 사용중인 PostgreSQL의 경우, 오라클의 자유로운 db link와 merge 등이 아주 그립습니다. 그래서 이 merge 기능을 대신하는 방법을 찾아봤습니다.
수정 가능한 WITH CTE 구문을 이용한 merge 기능 구현
WITH TEST AS (
UPDATE world_human A
SET cel_phone = B.cel_phone, email_addr = B.email_addr
FROM servay B
WHERE A.human_id = B.human_id
RETURNING A.*)
INSERT INTO world_human(human_id, cel_phone, email_addr)
SELECT C.human_id, C.cel_phone, C.email_addr
FROM servay C
WHERE C.human_id NOT IN (SELECT human_id FROM TEST)
;
이렇게하면 MERGE와 동일하게 입력 및 수정을 하나의 쿼리로 실행할 수 있습니다.
아 조건이 하나있는데, PostgreSQL 버전이 9.1.3이어야합니다. 9.0 버전에서는 안되는걸 테스트와 메뉴얼로 확인 했습니다. 9.1.2나 9.1.1에서도 잘 되는지는 확인을 못 했습니다.
iPhone 에서 작성된 글입니다.
수정 가능한 WITH CTE 구문을 이용한 merge 기능 구현
WITH TEST AS (
UPDATE world_human A
SET cel_phone = B.cel_phone, email_addr = B.email_addr
FROM servay B
WHERE A.human_id = B.human_id
RETURNING A.*)
INSERT INTO world_human(human_id, cel_phone, email_addr)
SELECT C.human_id, C.cel_phone, C.email_addr
FROM servay C
WHERE C.human_id NOT IN (SELECT human_id FROM TEST)
;
이렇게하면 MERGE와 동일하게 입력 및 수정을 하나의 쿼리로 실행할 수 있습니다.
아 조건이 하나있는데, PostgreSQL 버전이 9.1.3이어야합니다. 9.0 버전에서는 안되는걸 테스트와 메뉴얼로 확인 했습니다. 9.1.2나 9.1.1에서도 잘 되는지는 확인을 못 했습니다.
iPhone 에서 작성된 글입니다.
'IT 기술 > Database' 카테고리의 다른 글
PostgreSQL의 view에 DML 명령을 실행하기 (0) | 2012.06.05 |
---|---|
PostgreSQL에서 "connect by" 계층 쿼리 구현 (0) | 2012.05.30 |
PostgreSQL을 써보니... (0) | 2012.04.04 |
티베로를 지원하는 접근제어 솔루션 (0) | 2011.12.02 |
MySQL Storage Engine들을 간단히 비교해봤습니다. (0) | 2011.11.01 |