본문 바로가기

MS-SQL

MSSQL UPDATE, UPDATE FROM

MSSQL의 UPDATE구문에 대해 알아보도록 하겠습니다. 일반적인 형태의 UPDATE구문은 UPDATE 테이블명 SET 형식으로 작성합니다.

INNER JOIN을 이용하여 다른 테이블과의 비교를 통해 또는 다른 테이블에 있는 데이터로 UPDATE 도 가능합니다.


TIP. UPDATE 구문을 사용할 때는 항상 SELECT 구문을 먼저 작성 후 WHERE절을 카피해서 사용합니다. 만약의 경우에 대비해야 하죠.


Fruit

 Seq

Name

 Flavor Rank

 1 

 딸기

 새콤하다  3

 2

 바나나

 달콤하다 1

 3

 사과

 향긋하다 2



상황1) 하나의 테이블 내에서 조건에 맞는 데이터를 업데이트 하려고 할 때.

Fruit테이블에서 Seq=1인 딸기를 Name은 "스토로베리"로, Flavor는 "매콤하다"로 변경한다고 할 경우

다음과 같이 쿼리를 작성합니다. 

SELECT * FROM Fruit WHERE Seq=1 --결과를 먼저 확인합니다.

UPDATE Fruit SET
    Name = '스트로베리'
    , Flavor = '매콤하다'
WHERE Seq = 1

뭐, 이건 어렵지 않습니다. 설명할 것도 없네요, 하지만 다음의 상황은 조금 복잡합니다.


상황2) 다른 테이블에서 값을 가져와 데이터를 업데이트 하려고 할 때.  

MonthlySales에서 10월의 순위를 가져와 Fruit의 Rank필드에 업데이트 하려고 할 경우.


MonthlySales

Name

Month

 Rank

 딸기

 9월

 3

 바나나

 9월

 1

 사과

 9월

 2

 딸기

 10월 1 

 바나나

 10월 2 

 사과

 10월 3


방법1) 인라인 쿼리 이용

UPDATE Fruit SET 
    Rank = (SELECT Rank 
            FROM MonthlySales 
            WHERE Name=Fruit.Name
                AND Month = '10월')

단순하게 생각해볼 수 있는 방법이지만 글쎄요... 


방법2) UPDATE FROM 이용

UPDATE FR SET
    Rank = MS.Rank
FROM Fruit AS FR
INNER JOIN MonthlySales AS MS
    ON FR.Name = MS.Name
WHERE MS.Month='10월'

좀 복잡해 보이시죠? 하지만 잘 보시면 복잡할게 하나도 없습니다. SELECT INNER JOIN만 알고 있다면요. 일반적인 JOIN문에 SELECT 대신 UPDATE문을 얹은 형태입니다.


SELECT
    FR.Rank
FROM Fruit AS FR
INNER JOIN MonthlySales AS MS
    ON FR.Name = MS.Name
WHERE MS.Month='10월'


감 잡으셨나요?


프로젝트의 성공을 기원합니다.