여태까지 특정 테이블에 UPDATE 하는 쿼리는 해봤어도 다중 JOIN을 한 테이블에 UPDATE 해본 적은 없어서 삽질을 많이 했다. 실행시켜야 되는 쿼리는 tableA, tableB, tableC 세 개의 테이블을 JOIN 을 해야한다. tableB는 bridge 역할을 해주는 테이블이고, tableC의 특정 값을 가진 tableA의 특정 값을 UPDATE 시켜야 한다.
내가 시도했던 쿼리문은 아래와 같다.
- 틀린 쿼리(FAIL)
- 쿼리만 봤을 땐 어떤 걸 의도하는구나 알겠지만 아예 실행이 되지 않는 쿼리다.
UPDATE
(
SELECT a."columnOfA", joinedT."columnOfJoinedT"
FROM schema."tableA" AS a
JOIN
(
SELECT b."columnOfB", c."columnOfC"
FROM schema."tableB" AS b
JOIN schema."tableC" AS c
ON b."joinKey2" = c."joinKey2"
) AS joinedT
ON a."joinKey1" = joinedT."joinKey1"
) AS final
SET "updateColumn" = REPLACE (final."updateColumn", 'AS-IS', 'TO-BE')
WHERE final."someColumn" = 'hasSpecificVal'
2. 틀린 쿼리 (FAIL)
- 이건 1번이 실패해서 작성했던 쿼리이다.
UPDATE schema."tableA"
FROM schema."tableA" AS a
JOIN
(
SELECT b."columnOfB", c."columnOfC"
FROM schema."tableB" AS b
JOIN schema."tableC" AS c
ON b."joinKey2" = c."joinKey2"
) AS joinedT
ON a."joinKey1" = joinedT."joinKey1"
SET "updateColumn" = REPLACE (a."updateColumn", 'AS-IS', 'TO-BE')
WHERE joinedT."someColumn" = 'hasSpecificVal'
3. 성공 쿼리 (SUCCESS)
- JOIN 문에는 tableB tableC를 조인
- WHERE 문 첫번째 조건은 table A와 tableB, tableC를 조인한 테이블을 조인하는 조건 명시
- 그 다음 AND 조건에 세 테이블을 조인한 테이블에서 원하는 조건 명시
UPDATE schema."tableA" AS a
SET "updateColumn" = REPLACE (a."updateColumn", 'AS-IS', 'TO-BE')
FROM schema."tableB" AS b
JOIN schema."tableC" AS c
ON b."joinKey2" = c."joinKey2"
WHERE
b."joinKey1" = a."joinKey1"
AND c."someColumn" = 'hasSpecificVal'