Bagaimana cara 3 tabel BERGABUNG dalam kueri UPDATE?

466

Saya mengajukan pertanyaan dan mendapat balasan yang membantu.

   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

Sekarang saya ingin melakukan ini jika ada 3 tabel yang terlibat seperti ini.

    UPDATE tableC c JOIN tableB b JOIN tableA a

pertanyaan saya pada dasarnya ... apakah ini mungkin untuk melakukan 3 tabel bergabung pada UPDATEpernyataan? dan apa sintaks yang benar untuk itu? Terima kasih. Apakah saya melakukan ...

 JOIN tableB, tableA
 JOIN tableB JOIN tableA
Ricky
sumber
2
Tentu itu mungkin. Cobalah. Sintaksnya sama seperti Anda memilikinya -Anda hanya perlu menambahkan yang berikutnya JOINdan ONkondisinya, sama seperti yang Anda lakukan dalam SELECTkueri.
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
Pertanyaan yang disebutkan di sini: stackoverflow.com/questions/15206746/…
Urs

Jawaban:

810

jawabannya adalah yeskamu bisa

coba seperti itu

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

EDIT:

Untuk Pembaruan umum, gabung:

   UPDATE TABLEA a 
   JOIN TABLEB b ON a.join_colA = b.join_colB  
   SET a.columnToUpdate = [something]
echo_Me
sumber
2
Namun anehnya, perangkat lunak HeidiSQL saya melaporkan baris yang tidak terpengaruh, meskipun data menunjukkan pembaruan telah dilakukan.
Pianoman
1
@Pianoman Bagi saya itu juga terjadi dan ada hubungannya dengan ON UPDATE CURRENT_TIMESTAMP, saya baru saja menambahkan pembaruan secara manual dan memperbaikinya, hanya mengatakan jika itu terjadi pada orang lain
eric.itzhak
Jika Anda memerlukan alat bantu visual untuk memperbaiki sambungan Anda
ram4nd
Saya pikir yang berikut ini adalah General Plan yang lebih baik: UPDATE table A JOIN table B ON {join data} JOIN table C ON {join data} JOIN {more join tables} SET A.column = {expression}(maafkan saya jika editor
blasted
Dimana WHERE?? Atau WHEREtidak mungkin?
Hijau
42

Cara alternatif untuk mencapai hasil yang sama adalah dengan tidak menggunakan JOINkata kunci sama sekali.

UPDATE TABLE_A, TABLE_B
SET TABLE_A.column_c = TABLE_B.column_c + 1
WHERE TABLE_A.join_col = TABLE_B.join_col
Matas Vaitkevicius
sumber
3
Saya mencoba ini pada 5.5.62 dan mysql tidak menyukai sintaks. Menurut manual [ dev.mysql.com/doc/refman/5.6/en/update.html] , permintaannya harus: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
Ini tidak implisit JOINdengan cara yang sama melakukan SELECT * FROM TABLE_A, TABLE_B ...melakukan
Madbreaks
Jadi apakah itu berarti bahwa dalam 5,5 hanya bentuk bergabung implisit diterima untuk pembaruan?
userfuser
@ penggunafuser Tidak, itu tidak, manual menyatakan sintaksis: UPDATE [LOW_PRIORITY] [IGNORE] table_references SET col_name1={expr1|DEFAULT} [, col_name2={expr2|DEFAULT}] ... [WHERE where_condition]Kemudian, manual menyatakan: " table_referencesKlausa daftar tabel yang terlibat dalam bergabung. Sintaksnya dijelaskan di Bagian 13.2.9.2, GABUNGKAN Sintaks ."
hmundt
4
Bukan hasil yang sama persis - Anda dapat melakukan join kiri dengan sintaks join.
Gerard ONeill
10

Di bawah ini adalah permintaan Pembaruan yang mencakup JOIN& WHEREkeduanya. Cara yang sama kita dapat menggunakan multiple join / where clause, Semoga ini akan membantu Anda: -

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')
Nitin Shukla
sumber
3
Selamat Datang di Stack Overflow! Terima kasih atas cuplikan kode ini, yang dapat memberikan bantuan segera. Penjelasan yang tepat akan sangat meningkatkan nilai pendidikannya dengan menunjukkan mengapa ini adalah solusi yang baik untuk masalah ini, dan akan membuatnya lebih bermanfaat bagi pembaca masa depan dengan pertanyaan yang serupa, tetapi tidak sama. Harap edit jawaban Anda untuk menambahkan penjelasan, dan berikan indikasi batasan dan asumsi apa yang berlaku.
Toby Speight
2

Alternatif General Plan, yang saya hanya tambahkan sebagai Jawaban independen karena "komentar pada jawaban" yang blasted tidak akan mengambil baris baru tanpa memposting seluruh pengeditan, meskipun belum selesai.

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}

Contoh:

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;
Tidak ada
sumber
1

Untuk contoh 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; 
MC1er
sumber