UPDATE sorgusunda 3 tablo JOIN nasıl yapılır?


466

Bir soru sordum ve bu cevabı aldım.

   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

Şimdi böyle bir şey dahil 3 tablolar varsa bunu yapmak için arıyorum.

    UPDATE tableC c JOIN tableB b JOIN tableA a

benim sorum temelde ... bu bir tablo 3 tablo katılmak yapmak mümkün UPDATEmü? ve bunun için doğru sözdizimi nedir? Teşekkür ederim. Ben ...

 JOIN tableB, tableA
 JOIN tableB JOIN tableA

2
Elbette mümkün. Bir şans ver. Sözdizimi, tıpkı bir sorguda yaptığınız gibi , sonraki JOINve ONkoşulunu eklemeniz yeterlidir SELECT.
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
Urs

Yanıtlar:


810

cevap şu yeski yapabilirsin

böyle dene

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

DÜZENLE:

Genel Güncelleme üyeliği için:

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

2
Ancak garip olan şey, verilerin güncellemelerin yapıldığını göstermesine rağmen, HeidiSQL yazılımımın etkilenen sıfır satırı bildirmesidir.
Pianoman

1
@Pianoman Benim için de oldu ve ON UPDATE CURRENT_TIMESTAMP ile ilgili bir şey vardı, sadece güncellemeyi manuel olarak ekledim ve düzelttim, sadece kimseye olursa olsun
söyledim


: Ben şu daha iyi bir genel Planı olduğunu düşünüyorum UPDATE table A JOIN table B ON {join data} JOIN table C ON {join data} JOIN {more join tables} SET A.column = {expression}(bu patlatılmış editör bir yayının tamamını yapmadan beni yeni satır girmek izin vermezse beni affet)
UncaAlby

Nerede WHERE?? Yoksa WHEREmümkün değil mi?
Yeşil

42

Aynı sonucu elde etmenin alternatif yolu , hiç JOINanahtar kelime kullanmak değildir .

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
Ben 5.5.62 denedim ve mysql sözdizimi gibi değildi. [ Dev.mysql.com/doc/refman/5.6/tr/update.html] kılavuzuna göre , sorgu şöyle olmalıdır: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
Bu JOINaynı şekilde bir örtük SELECT * FROM TABLE_A, TABLE_B ...yapar
Madbreaks

Bu, 5.5'te güncelleme için yalnızca örtülü birleştirme formunun kabul edildiği anlamına mı geliyor?
userfuser

@userfuser Hayır, kılavuzda sözdizimini belirtir: UPDATE [LOW_PRIORITY] [IGNORE] table_references SET col_name1={expr1|DEFAULT} [, col_name2={expr2|DEFAULT}] ... [WHERE where_condition]Daha sonra kılavuzda: " table_referencesMadde, birleşimde yer alan tabloları listeler. Sözdizimi Bölüm 13.2.9.2, JOIN Sözdizimi'nde açıklanır ."
hmundt

4
Tam olarak aynı sonuç değil - birleştirme sözdizimi ile sol birleşimler yapabilirsiniz.
Gerard ONeill

10

Aşağıda JOIN& WHEREikisini içeren Güncelleme sorgusu bulunmaktadır . Aynı şekilde birden fazla birleştirme / nerede madde kullanabiliriz, size yardımcı olacağını umuyoruz: -

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
Stack Overflow'a hoş geldiniz! Anında yardım sağlayabilecek bu kod snippet'i için teşekkür ederiz. Düzgün bir açıklama , bunun neden problem için iyi bir çözüm olduğunu göstererek eğitim değerini büyük ölçüde artıracak ve benzer, ancak aynı olmayan soruları olan gelecekteki okuyucular için daha yararlı hale getirecektir. Lütfen açıklama eklemek için cevabınızı düzenleyin ve hangi sınırlamaların ve varsayımların geçerli olduğunu belirtin.
Toby Speight

2

Sadece bağımsız bir Cevap olarak eklediğim alternatif bir Genel Plan, çünkü patlamış "bir cevaba yapılan yorum", henüz bitmemiş olsa bile tüm düzenlemeyi göndermeden yeni satırlar almayacaktır.

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}

Misal:

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 örneği için:

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; 
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.