[MSSQL] JOIN UPDATE 완벽 정리 (조인 UPDATE)
- 데이터베이스/MSSQL
- 2025. 12. 28.
SQL Server에서 UPDATE를 작성하다 보면, 다른 테이블의 조건을 기준으로 특정 행만 업데이트해야 하는 경우가 많이 있다. SQL Server는 UPDATE ... FROM ... JOIN ... 형태를 지원하기 때문에 조인 업데이트를 직관적으로 작성할 수 있고, 경우에 따라 MERGE 문을 활용해 동일한 매칭(조인) 로직으로 업데이트를 수행할 수도 있다. 또한 조인을 직접 쓰기 애매한 상황에서는 IN, EXISTS, 스칼라 서브쿼리처럼 서브쿼리 방식으로 조인 업데이트와 동일한 효과를 만들 수 있다.
| 목차 |
다른 테이블과 JOIN 하여 UPDATE 방법 (권장)
UPDATE d
SET d.loc = 'CALIFORNIA'
FROM dbo.dept d
JOIN dbo.emp e
ON d.deptno = e.deptno
WHERE e.ename = 'KING'
![]() |
위의 쿼리문은 부서(dept) 테이블과 사원(emp) 테이블을 조인하여 지역(loc)을 UPDATE 하는 예제이다.
UPDATE d 형태로 FROM 절에서 업데이트 대상 테이블의 별칭(d) 지정하여 사용하였으며, 별칭을 지정하는 방식이 가독성과 오류를 방지할 수 있으므로 권장한다.
![]() |
JOIN UPDATE 쿼리문을 실행하고 부서(dept) 테이블의 값이 "NEW YORK"에서 "CALIFORNIA"로 변경된 것을 확인할 수 있다.
별칭을 사용하지 않고 테이블명을 직접 지정하는 방법
UPDATE dbo.dept
SET loc = 'CALIFORNIA'
FROM dbo.dept d
JOIN dbo.emp e
ON d.deptno = e.deptno
WHERE e.ename = 'KING'
![]() |
위의 쿼리문의 실행 결과는 첫번째와 동일하지만, UPDATE d로 별칭을 사용하지 않고 UPDATE dbo.dept로 테이블명으로 직접 사용하여 업데이트를 하였다. (별칭 사용과 동작은 같지만 덜 권장되는 형태)
업데이트되는 dept가 UPDATE 절의 dept인지 FROM 절의 dept인지 헷갈릴 수 있으므로, 별칭을 사용하는 첫 번째 쿼리문을 권장한다.
업데이트할 테이블이 FROM 절에 없을 경우
UPDATE dbo.dept
SET loc = 'CALIFORNIA'
FROM dbo.emp a
JOIN dbo.emp b
ON a.mgr = b.empno
WHERE b.ename = 'KING'
AND dept.deptno = b.deptno
![]() |
위의 쿼리문은 업데이트 대상 테이블인 dbo.dept가 FROM 절에 없을 경우 JOIN UPDATE 하는 방법이다.
UPDATE dbo.dept로 업데이트할 테이블명을 지정하고, WHERE 절에서 FROM 절의 테이블과 조인하여 업데이트를 하면 된다. 단순한 목적의 UPDATE라면 첫 번째 예제처럼 dept를 FROM에 포함시키고 조인하는 방식을 권장한다.
MERGE 문을 사용하여 JOIN UPDATE 방법
MERGE INTO dbo.dept AS d
USING dbo.emp AS e
ON e.deptno = d.deptno
AND e.ename = 'KING'
WHEN MATCHED THEN
UPDATE SET d.loc = 'CALIFORNIA';
![]() |
MERGE 문을 사용하여 JOIN UPDATE를 할 수 있다. UPDATE 외에도 INSERT, DELETE도 가능하므로 다양한 상황에서 사용할 수 있다. 그러나 구문이 수행되는 방식이 조금 다르므로 단순 JOIN UPDATE가 목적이라면 첫 번째 방법을 권장한다.
MERGE 문은 업데이트할 데이터가 중복으로 조회되는 경우 오류가 발생할 수 있다.
MERGE INTO dbo.dept AS d
USING dbo.emp AS e
ON e.deptno = d.deptno
AND e.job = 'ANALYST'
WHEN MATCHED THEN
UPDATE SET d.loc = 'CALIFORNIA';
![]() |
MERGE는 편리한 문법이지만 같은 대상 행이 여러 소스 행과 동시에 매칭되면(1:N) 오류가 날 수 있다. MERGE를 쓸 땐 키 기준으로 소스가 1행만 나오게 정리(유일화) 해서 쓰는 것이 안전하다.
![]() |
서브쿼리를 사용하여 JOIN UPDATE 방법
UPDATE dbo.dept
SET loc = (SELECT a.loc FROM dbo.dept a WHERE a.deptno = 10)
WHERE deptno IN (20, 30)
SET 절에서 스칼라 서브쿼리를 사용하여 값을 업데이트할 수 있다.
서브쿼리의 결과는 하나의 행, 하나의 열이 조회되어야 한다.
UPDATE dbo.dept
SET loc = 'TEXAS'
WHERE dept.deptno IN (SELECT a.deptno
FROM dbo.emp a
WHERE a.job = 'SALESMAN')
WHERE 절에서 서브쿼리를 사용하여 업데이트할 데이터 항목을 가져올 수 있다.
조인을 사용하지 않을 경우 WHERE 절에서 서브쿼리를 자주 사용한다.
UPDATE dbo.dept
SET loc = 'TEXAS'
WHERE EXISTS (SELECT 1
FROM dbo.emp a
WHERE a.job = 'SALESMAN'
AND a.deptno = dept.deptno)
위의 IN 연산자를 사용한 쿼리를 EXISTS 연산자로 변경한 쿼리문이다. IN 연산자와 동일한 기능을 한다.
상황에 따라서 IN 연산자보다 EXISTS 연산자를 사용할 경우 성능이 좋을 때가 있으므로 사용법을 알아두면 좋다.
[MSSQL] UPDATE 문 사용법 3가지 (데이터 수정)
SQL Server에서 테이블이 데이터를 수정하기 위해서는 UPDATE 문을 사용하면 된다. SQL Server에서는 UPDATE 문에서 FROM 절을 사용할 수 있어서 다른 테이블과 조인을 하여 업데이트를 할 수 있다. 조인을
gent.tistory.com
[MSSQL] MERGE 문 사용법 (DUAL, UPDATE와 INSERT를 한번에)
MERGE 문을 사용하면 변경할 테이블에 데이터가 존재하는지 체크하고, UPDATE, DELETE, INSERT를 한 번에 작업이 가능하다. MERGE 문을 사용하지 않을 경우 해당 조건으로 테이블을 SELECT 한 후 IF 조건을
gent.tistory.com






