[DE] SQL 에서 틀린 데이터 갈아끼우기 (update, upsert)
데이터를 다루다 보면 과거의 데이터를 수정할 일이 생긴다. 에어플로우에서 이 작업을 할 수 있게 도와주는걸 backfill 이라 부르고 catchup 기능으로 이걸 구현할 수 있는데, DB 를 직접 sql 구문을 이용해 수정하기도 한다. 이때 사용되는 몇가지 sql 구문들을 살펴보자
1. upsert 방법
upsert 는 말 그대로 update + insert 방법이다. 스키마의 key 값을 검사해 중복이 있다면 업데이트, 중복이 없다면 insert 를 해주는 방법인데, 이 문법으로 구현할 수 있다
INSERT INTO [TABLE] #업데이트 할 테이블
(
[COLUMN1] #업데이트 할 컬럼
, [COLUMN2]
, [COLUMN3]
)
VALUES (
[VALUE1] #업데이트 될 값
, [VALUE2]
, [VALUE3]
)
#중복을 검사하기, 이때 column 1 이 기본키라는 가정하에 진행된다.
ON DUPLICATE KEY UPDATE
[COLUMN2] = [VALUE2], #컬럼2는 value 2 로 대체해줘 ~
[COLUMN3] = [VALUE3]
근데 보통 실무에서 value 를 하나하나 넣는 경우는 없다.. 넣어야 할 value 가 어떤 테이블로 구성 된 경우, value 절을 select ~from 절로 대체해서 사용해주자
이런식으로
INSERT INTO upsert_table (co1, col2, col3)
SELECT col111,col222, col333
FROM source_table
ON DUPLICATE KEY UPDATE
col1 = VALUES(col111),
col2 = VALUES(col222);
2. 그냥 전부 데이터 대체해버리는 방법! Update ~ set 구문
보통 dba 분들이 자주 쓸거같은 구문이다. update ~ set 구문을 쓰면 조건에 맞은 값들이 "변경" 되고, 조건을 따로 걸지 않으면 모든 값이 바뀐다.
이때, 조금 더 우리에게 익숙한 insert into 와는 무엇이 다른가! insert into 구문은 값을 그대로 냅두고 "추가" 하는 방법이다. 이 경우 귀찮게 또 delete 구문을 이용해 원 데이터를 지워주어야 할 것이다..
문법은 아주 이지하다 이지해. where 이후부터는 동일
UPDATE [TABLE]
SET [COL] = '변경할값'
WHERE [CONDITION]
근데 이제 이것도 실무에선.. 변경할 값을 누가 수기로 입력하냐 이말이다.
변경값이 들어있는 테이블의 컬럼을 가져오고 싶을땐 괄호 안의 select 구문을 이용해주자
UPDATE [TABLE1]
SET [col1] = (
SELECT [col111] #바꿀 값 선택
FROM [TABLE111]
WHERE [CONDITION]
);
오늘의 포스팅 끝 ~ 유익한 걸 배운 하루 ~~~