PostgreSQL에서의 머지문이 머지?

고뱅쟁이·2020년 6월 4일
0
post-thumbnail

궁금증

PostgreSQL에 간단한 쿼리를 짜야되는 일이 생겼다.
기준 테이블의 컬럼 중 하나의 데이터를 대상 테이블에다가 동일한 값으로 UPDATE를 해줘야 했다.
만약 대상 테이블에 데이터가 없으면 INSERT를 하면 되는 간단한 작업!

어떻게??

UPDATE도 해야되고 INSERT도 해야되니 머지문을 쓰자! 데이터양도 안많으니까 머지문쓰면 되지~

머지문은 성능저하의 원인이 될 수 있으므로 되도록이면 안쓰는게 좋다. 라고 알고있는데 PostgreSQL에서도 저하가 될 수 있는가는 모르겠다.

근데 머지문이없다???
띠용?
표준SQL인줄알았는데 아니였던 것이었다..

호다닥 찾아보니 머지문처럼 PostgreSQL에서 할 수 있는 쿼리가 있었다.
** 비슷하면서도 다르니 처음 다루는 DB의 경우 검색을 한번 해보는게 좋을 것 같다.

우선 머지문을 보면서 다른점을 보자.

Oracle의 Merge문

MERGE INTO 대상테이블명 TGT
    USING 기준테이블명 ORI
       ON (조건)
    WHEN MATCHED THEN
        UPDATE SET TGT.컬럼명 = ORI.컬럼명
    WHEN NOT MATCHED THEN
        INSERT (컬럼) 
        VALUES (TGT의 값)
;

조건에 맞으면 UPDATE, 아니면 INSERT
머지문을 먼저 접해서 그런가 조금더 가독성이 좋은 느낌이다.

아래는 postgreSQL에서 사용할 수 있는 쿼리이다.

WITH UPDATE_TARGET AS (
UPDATE target_table TGT 
SET TGT.컬럼명 = ORI.컬럼명
FROM original_table ORI
WHERE 
(조건)
)
INSERT INTO target_table (컬럼명)
SELECT 
컬럼명
FROM original_table
WHERE [KEY] NOT IN (SELECT [KEY] FROM target_table);

WITH절에 UPDATE문을 넣어두고 아래 INSERT문을 작성할 때 조건을 적절하게 주면된다.
나의 경우에는 update할 대상에 조건이 좀 별도로 있었고
아예 없는데이터에 대해서만 추가를 하는 것이여서 WITH절을 안썼다.
구글에 검색해보니 다른분들은

WHERE NOT EXISTS (select * from UPDATE_TARGET)

이렇게 조건을 주었다.
(제가 짠 쿼리도 잘 돌아가서.. 혹시 저의 글을 보신분들은 참고해서 쿼리를 작성하세요.)

결론

  1. 있을까??? 하면 있다.
profile
냥이들과 함께하는 만년 초보 개발자

0개의 댓글