Làm thế nào để thực hiện 3 bảng THAM GIA trong truy vấn CẬP NHẬT?


466

Tôi đã hỏi một câu hỏi và nhận được câu trả lời này giúp.

   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

Bây giờ tôi đang tìm cách để làm điều này nếu có 3 bảng liên quan đến cái gì đó như thế này.

    UPDATE tableC c JOIN tableB b JOIN tableA a

Câu hỏi của tôi về cơ bản là ... điều này có thể làm 3 bảng tham gia vào một UPDATEtuyên bố không? và cú pháp chính xác cho nó là gì? Cảm ơn bạn. Tôi có làm ...

 JOIN tableB, tableA
 JOIN tableB JOIN tableA

2
Chắc chắn là có thể. Hãy thử một lần. Cú pháp giống như bạn có nó - bạn chỉ cần thêm tiếp theo JOINONđiều kiện của nó , giống như bạn làm trong một SELECTtruy vấn.
Michael Berkowski

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

1
Câu hỏi được đề cập ở đây: stackoverflow.com/questions/15206746/ từ
Urs

Câu trả lời:


810

câu trả lời là yesbạn có thể

thử nó như thế

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

BIÊN TẬP:

Để cập nhật chung tham gia:

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

2
Tuy nhiên, điều kỳ lạ là phần mềm HeidiQuery của tôi báo cáo không có hàng nào bị ảnh hưởng, mặc dù dữ liệu cho thấy các bản cập nhật đã được thực hiện.
Pianoman

1
@Pianoman Đối với tôi nó cũng xảy ra và nó có liên quan đến ON UPDATE CURRENT_TIMESTAMP, tôi chỉ cần thêm cập nhật thủ công và nó đã sửa nó, chỉ nói nếu nó xảy ra với bất kỳ ai khác
eric.itzhak

Nếu bạn cần một trợ giúp trực quan để có được sự tham gia chính xác của bạn: Browse-tutorials.com/tutorial/mysql-joins-visual-interesentation
ram4nd

Tôi nghĩ sau đây là một Kế hoạch chung tốt hơn: UPDATE table A JOIN table B ON {join data} JOIN table C ON {join data} JOIN {more join tables} SET A.column = {expression}(tha thứ cho tôi nếu biên tập viên bị thổi phạt này sẽ không cho tôi nhập dòng mới mà không làm một bài đầy đủ)
UncaAlby

Ở đâu WHERE?? Hay WHERElà không thể?
Xanh

42

Cách khác để đạt được kết quả tương tự là không sử dụng JOINtừ khóa nào cả.

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
Tôi đã thử điều này trên 5.5.62 và mysql không thích cú pháp. Theo hướng dẫn [ dev.mysql.com/doc/refman/5.6/en/update.html] , truy vấn sẽ là: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
Điều này không một tiềm ẩn JOINtrong cùng một cách làm SELECT * FROM TABLE_A, TABLE_B ...không
Madbreaks

Vì vậy, điều đó có nghĩa là trong 5.5 chỉ có hình thức tham gia ngầm được chấp nhận để cập nhật?
userfuser

@userfuser Không, không, hướng dẫn sử dụng nêu cú pháp: UPDATE [LOW_PRIORITY] [IGNORE] table_references SET col_name1={expr1|DEFAULT} [, col_name2={expr2|DEFAULT}] ... [WHERE where_condition]Sau này, hướng dẫn sử dụng: " table_referencesMệnh đề liệt kê các bảng liên quan đến phép nối. Cú pháp của nó được mô tả trong Phần 13.2.9.2, Cú pháp THAM GIA ."
hmundt

4
Không phải là kết quả chính xác - bạn có thể thực hiện các phép nối trái với cú pháp nối.
Gerard ONeill

10

Dưới đây là truy vấn Cập nhật bao gồm JOIN& WHEREcả hai. Tương tự như cách chúng ta có thể sử dụng nhiều mệnh đề tham gia / where, Hy vọng nó sẽ giúp bạn: -

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
Chào mừng bạn đến với Stack Overflow! Cảm ơn bạn vì đoạn mã này, có thể cung cấp một số trợ giúp ngay lập tức. Một lời giải thích phù hợp sẽ cải thiện đáng kể giá trị giáo dục của nó bằng cách chỉ ra lý do tại sao đây là một giải pháp tốt cho vấn đề và sẽ giúp nó hữu ích hơn cho những độc giả tương lai với những câu hỏi tương tự, nhưng không giống nhau. Vui lòng chỉnh sửa câu trả lời của bạn để thêm giải thích và đưa ra dấu hiệu về những hạn chế và giả định được áp dụng.
Toby Speight

2

Một Kế hoạch chung thay thế, mà tôi chỉ thêm vào như một Câu trả lời độc lập vì "bình luận về câu trả lời" đã nổ tung sẽ không có dòng mới mà không đăng toàn bộ chỉnh sửa, mặc dù nó chưa hoàn thành.

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}

Thí dụ:

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

Ví dụ về 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; 
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.