업데이트 쿼리에서 3 테이블 조인을 수행하는 방법은 무엇입니까?


466

나는 질문을하고 도움이 회신을 받았습니다.

   UPDATE TABLE_A a JOIN TABLE_B b 
   ON a.join_col = b.join_col AND a.column_a = b.column_b 
   SET a.column_c = a.column_c + 1

이제 이와 같은 3 개의 테이블이 있으면이 작업을 수행하려고합니다.

    UPDATE tableC c JOIN tableB b JOIN tableA a

내 질문은 기본적으로 ...이 UPDATE문장 에서 3 테이블 조인을 수행 할 수 있습니까? 올바른 구문은 무엇입니까? 감사합니다. 내가합니까 ...

 JOIN tableB, tableA
 JOIN tableB JOIN tableA

2
물론 가능합니다. 시도 해봐. 구문은 마치 구문과 같습니다 . 쿼리 에서와 마찬가지로 다음 조건 JOINON조건 을 추가하면 SELECT됩니다.
Michael Berkowski 2014 년

2
UPDATE t1 JOIN t2 ON t1.id = t2.t1_id JOIN t3 ON t3.id = t2.t3_id SET t1.col = 'newval'
Michael Berkowski 2014 년

1
언급 된 질문은 여기에 있습니다 : stackoverflow.com/questions/15206746/…
Urs

답변:


809

대답은 yes당신 이 할 수 있다는 것입니다

그렇게 해봐

UPDATE TABLE_A a 
    JOIN TABLE_B b ON a.join_col = b.join_col AND a.column_a = b.column_b 
    JOIN TABLE_C c ON [condition]
SET a.column_c = a.column_c + 1

편집하다:

일반적인 업데이트 가입 :

   UPDATE TABLEA a 
   JOIN TABLEB b ON a.join_colA = b.join_colB  
   SET a.columnToUpdate = [something]

2
그러나 데이터가 업데이트가 완료되었음을 보여 주지만 HeidiSQL 소프트웨어는 영향을받지 않는 행을보고하지 않습니다.
피아노 맨

1
나에게 @Pianoman 그것은뿐만 아니라 무슨 일이 있었 그리고, 난 그냥 업데이트를 수동으로 추가하고 그냥 다른 사람에게 무슨 일이 생기면 말하고, 그것을 고정 ON UPDATE CURRENT_TIMESTAMP 함께 할 수있는 뭔가가 있었다
eric.itzhak

조인을 올바르게하기 위해 시각 보조가 필요한 경우 : browse-tutorials.com/tutorial/mysql-joins-visual-representation
ram4nd

: 나는 다음이 더 나은 종합 계획 생각 UPDATE table A JOIN table B ON {join data} JOIN table C ON {join data} JOIN {more join tables} SET A.column = {expression}(이 래스팅 편집기 전체 게시물을하지 않고 나 개행 문자를 입력 할 수 없습니다 경우에 저를 용서)
UncaAlby

어디 WHERE입니까 ?? 아니면 WHERE불가능합니까?
Green

42

동일한 결과얻는 다른 방법은 JOIN키워드를 전혀 사용하지 않는 것입니다.

UPDATE TABLE_A, TABLE_B
SET TABLE_A.column_c = TABLE_B.column_c + 1
WHERE TABLE_A.join_col = TABLE_B.join_col

3
5.5.62에서 이것을 시도했지만 mysql은 구문을 좋아하지 않았습니다. 매뉴얼 [ dev.mysql.com/doc/refman/5.6/en/update.html] 에 따르면 쿼리는 다음과 같아야합니다.UPDATE TABLE_A, TABLE_B SET TABLE_A.column_c = TABLE_A.column_c +1 WHERE TABLE_A.join_col = TABLE_B.join_col
Noe Nieto

7
이 암시 않습니다 JOIN같은 방법으로 일을 SELECT * FROM TABLE_A, TABLE_B ...수행
Madbreaks

그렇다면 5.5에서는 암시 적 조인 양식 만 업데이트가 허용된다는 의미입니까?
userfuser

@userfuser 아니요, 매뉴얼에는 다음과 같은 구문이 나와 있습니다. UPDATE [LOW_PRIORITY] [IGNORE] table_references SET col_name1={expr1|DEFAULT} [, col_name2={expr2|DEFAULT}] ... [WHERE where_condition]나중에 매뉴얼 상태 table_references에는 " 조인과 관련된 테이블이 나열되어 있습니다. 구문은 13.2.9.2 절, JOIN 구문에 설명되어 있습니다."
hmundt

4
정확히 같은 결과는 아닙니다. 조인 구문으로 왼쪽 조인을 수행 할 수 있습니다.
Gerard ONeill

10

아래는 JOIN& WHERE모두 를 포함하는 업데이트 쿼리입니다 . 여러 조인 / where 절을 사용할 수있는 것과 같은 방법으로 도움이되기를 바랍니다.

UPDATE opportunities_cstm oc JOIN opportunities o ON oc.id_c = o.id
 SET oc.forecast_stage_c = 'APX'
 WHERE o.deleted = 0
   AND o.sales_stage IN('ABC','PQR','XYZ')

3
스택 오버플로에 오신 것을 환영합니다! 이 코드 스 니펫에 감사드립니다. 즉각적인 도움이 될 수 있습니다. 적절한 설명 이것이 문제에 대한 좋은 해결책 인지 보여줌으로써 교육적 가치를 크게 향상시킬 것이며 , 유사하지만 동일하지 않은 질문을 가진 미래 독자들에게 더 유용 할 것입니다. 제발 편집 설명을 추가하고, 제한 및 가정이 적용 무엇의 표시를 제공하는 답변을.
Toby Speight 2016 년

2

폭발적인 "답변에 대한 의견"은 아직 완료되지 않은 경우에도 전체 편집 내용을 게시하지 않고 줄 바꿈을 수행하지 않기 때문에 독립적 인 답변으로 만 추가하는 대체 일반 계획입니다.

UPDATE table A
JOIN table B ON {join fields}
JOIN table C ON {join fields}
JOIN {as many tables as you need}
SET A.column = {expression}

예:

UPDATE person P
JOIN address A ON P.home_address_id = A.id
JOIN city C ON A.city_id = C.id
SET P.home_zip = C.zipcode;

1

PostgreSQL 예제의 경우 :

UPDATE TableA AS a
SET param_from_table_a=FALSE -- param FROM TableA
FROM TableB AS b
WHERE b.id=a.param_id AND a.amount <> 0; 
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.