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 모두 구문이 현재 표준과 일치하며, 오탈자·모순 없음.