///

SQL UPDATE FROM SELECT Capsule

"B 의 값으로 A 를 업데이트" 는 DB 마다 syntax 가 다르다. SQL Server / Postgres : UPDATE A SET … FROM A INNER JOIN B …. MySQL : UPDATE A INNER JOIN B SET …. Oracle / ANSI : MERGE 또는 correlated subquery.

///

kind: capsule status: active visibility: private license: CC-BY-SA-4.0 summary: 다른 테이블 값으로 UPDATE — SQL Server/Postgres: UPDATE … FROM … JOIN. MySQL: UPDATE A JOIN B. Oracle: MERGE 또는 서브쿼리. tags: - sql - update - join - capsule


SQL UPDATE FROM SELECT Capsule

Summary#

"B 의 값으로 A 를 업데이트" 는 DB 마다 syntax 가 다르다. SQL Server / Postgres: UPDATE A SET … FROM A INNER JOIN B …. MySQL: UPDATE A INNER JOIN B SET …. Oracle / ANSI: MERGE 또는 correlated subquery.

Claim#

SQL Server / PostgreSQL#

UPDATE
    Table_A
SET
    Table_A.col1 = Table_B.col1,
    Table_A.col2 = Table_B.col2
FROM
    Some_Table AS Table_A
    INNER JOIN Other_Table AS Table_B
        ON Table_A.id = Table_B.id
WHERE
    Table_A.col3 = 'cool';
  • UPDATE 타겟을 FROM 절에서 다시 나열 (Postgres 는 이게 핵심; 타겟 테이블 자체는 FROM 에서 제외해도 동작)
  • WHERE 절은 추가 필터

PostgreSQL 권장 형태#

UPDATE Table_A AS a
SET col1 = b.col1,
    col2 = b.col2
FROM Other_Table AS b
WHERE a.id = b.id
  AND a.col3 = 'cool';

Postgres 는 타겟을 FROM 에 반복 나열하지 않는 것 이 정석.

MySQL#

UPDATE Table_A AS a
INNER JOIN Other_Table AS b ON a.id = b.id
SET a.col1 = b.col1,
    a.col2 = b.col2
WHERE a.col3 = 'cool';

SET 이 JOIN 뒤에 온다.

Oracle (ANSI-safe — MERGE)#

MERGE INTO Table_A a
USING Other_Table b
ON (a.id = b.id)
WHEN MATCHED THEN UPDATE SET
    a.col1 = b.col1,
    a.col2 = b.col2
WHERE a.col3 = 'cool';

Universal — Correlated Subquery (모든 DB)#

UPDATE Table_A
SET col1 = (SELECT col1 FROM Other_Table WHERE Other_Table.id = Table_A.id),
    col2 = (SELECT col2 FROM Other_Table WHERE Other_Table.id = Table_A.id)
WHERE EXISTS (SELECT 1 FROM Other_Table WHERE Other_Table.id = Table_A.id)
  AND col3 = 'cool';
  • 호환성 최고, 성능은 보통 최악 (DB 별 optimizer 에 따라 개선되기도)
  • 매 컬럼마다 서브쿼리 반복 → 단일 컬럼에는 괜찮음

#

  • 대량 업데이트 는 트랜잭션 분할 (10k 행씩) — 장기 lock 방지
  • 실행 전 같은 조건으로 SELECT 돌려 영향 행수 확인
  • WHERE 절 없으면 전체 테이블 업데이트 — Postgres 는 BEGIN; … ROLLBACK; 으로 먼저 dry-run

Scope#

  • SQL Server 2008+, PostgreSQL 8.4+, MySQL 5.0+, Oracle 9i+ (MERGE).
  • ANSI 표준은 UPDATE … FROM 을 허용하지 않음 — 각 DB 확장.

Caveats#

  • NULL 매칭 이슈: join 조건에서 양쪽 NULL 이면 join 안 됨 → 해당 행은 업데이트 안 됨. 의도 여부 확인.
  • Subquery 가 여러 행 반환하면 error (Postgres) 또는 임의 행 (MySQL) — id 컬럼 unique 보장 필수.
  • Postgres 의 UPDATE … FROM 은 타겟 테이블을 FROM 에 다시 넣으면 self-join 이 됨 → 예기치 않은 중복 매칭.
  • 트리거·체크 제약·FK 가 걸린 테이블이면 업데이트 순서와 영향 행수 주의.

Source#

  • Stack Overflow Q: UPDATE from a SELECT
  • Accepted Answer: https://stackoverflow.com/a/2334741 — by Robin Day
  • License: CC BY-SA 4.0 (Stack Exchange user contributions)
  • 조회일: 2026-04-19

Sagwan Revalidation 2026-04-19T01:14:43Z#

  • verdict: ok
  • note: SQL Server/Postgres/MySQL/Oracle 모두 구문이 현재 표준과 일치하며, 오탈자·모순 없음.