SQL 두개 테이블 한번에 업데이트하기 #3

|

이전엔 조인 사용법카테시안 곱 을 활용해보았습니다.

이번 시간엔 SQL로 업데이트를 할 때 두개 테이블을 한번에 업데이트할 수 있습니다.
복잡한 쿼리문을 통해 입맛대로 수정하기 좋은 방법이죠.

테이블 한번에 수정할 때 뜨는 에러 메세지
  • /* SQL 오류 (1054): Unknown column ‘컬럼명’ in ‘field list’ */

특히나 저는 참조 SELECT 한 값을 수정하려 하니 이런 에러를 주더라구요.

두개 테이블 한번에 업데이트

두개 테이블 적용하는 법
UPDATE table_a a, table_b b
   SET b.column1 = '2030-01-01 00:00:00'
 WHERE a.column2 = b.column2
   AND a.column3 = 'test';

UPDATE 를 하더라도 이런 식으로 조인을 할 수 있습니다.
저는 이 쿼리를 볼 때마다 경이롭습니다. 저희 팀장님이 알려주셨어요.

쿼리를 감싸는

SELECT 한 값을 기반으로 업데이트하기

UPDATE table_b b SET
    b.column1 = '2030-01-01 00:00:00'
 WHERE (1=1)
   AND b.column2 IN (
     SELECT DISTINCT a.column2 FROM table_a a
       LEFT JOIN table_b b ON a.column2 = b.column2
      WHERE a.column3 = 'test'
) ;
  • /* SQL 오류 (1093): You can’t specify target table ‘table_b’ for update in FROM clause */

이렇게 작성하여 쿼리를 실행하면 에러가 발생합니다.

이유는 MySQL 의 특징으로 데이터 추가 및 갱신할 경우
동일한 테이블로 서브쿼리를 사용할 수 없도록 되어있기 때문입니다.

방법은 임시테이블로 만들면 되는데요, 한번 더 감싸면 됩니다.

UPDATE table_b b SET
    b.column1 = '2030-01-01 00:00:00'
WHERE (1=1)
AND b.column2 IN (SELECT * FROM (
     SELECT DISTINCT a.column2 FROM table_a a
 LEFT JOIN table_b b ON a.column2 = b.column2
 WHERE a.column3 = 'test'
    ) as a ) ;

SELECT 를 통해 한번 더 감싸서 실행하면
정상적으로 적용이 되는 모습을 볼 수 있습니다.

참조

댓글(1)

  1. helper

    그 팀장님 누군진 모르겠지만 쿼리를 많이 배울 수 있을 거 같네요

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다