Sütunu başka bir tablodaki verilerle güncelleme


11

Karmaşık sorun üzerinde çalışıyorum, ancak bu soruna basitleştireceğim.

İki masam var

A [ID, column1, column2, column3]
B [ID, column1, column2, column3, column4]

ve üçüncüsünü güncellemek istiyorum:

C [ID, column1, column2,column3] 

Bu sorguyu kullanarak başka bir üçüncü tablo güncelleştiriyorum.

UPDATE C 
  set column1=t.firstTab, column2=t.secondTab, column3=t.thirdTab 
  from (select A.column1 as firstTab, B.column2 as secTab, 
              (A.column1 + B.column2) thirdTab 
        from A, B limit 1; ) as t ; 

Bende var:

UPDATE 0

Bu sorguyu çalıştırdığımda:

select A.column1 as firstTab, B.column2 as secTab, (A.column1 + B.column2) thirdTab 
            from A, B limit 1; 

Sonuç aldım. Bir şey mi kaçırıyorum?

Örnek veriler: http://sqlfiddle.com/#!15/e4d08/5

Yanıtlar:


19

Uygun form şu şekildedir (bilgi eksikliği için mevcut pg sürüm 9.3 varsayarak):

UPDATE C 
SET    column1 = A.column1 
     , column2 = B.column2 
     , column3 = A.column1 + B.column2
FROM   A
JOIN   B ON A.id = B.id  -- ??? not specified in question!
WHERE  C.id = A.id      --  ??? not specified in question!
AND   (C.column1, C.column2, C.column3) IS DISTINCT FROM
      (A.column1, B.column2, A.column1 + B.column2);

Son WHEREfıkra, hiçbir şeyi değiştirmeyecek boş güncelleştirmelerden kaçınmak için isteğe bağlıdır (ancak tam maliyetle yeni bir satır sürümü yazıyor).

ypercube zaten yorumunda temel bir açıklama yaptı:

Çoğaltma almıyorsunuz. Türetilmiş tablonuz çapraz birleştirme Ave B( herhangi bir birleştirme koşulu olmadan ) ve daha sonra rastgele bir satır seçerek ( LIMIT 1olmadan ORDER BY). Daha sonra, tüm tablo satırlarını güncellemek için rasgele satırdaki değerleri kullanır C. Farklı C satırları için farklı değerlerin kullanılmasını istiyorsanız, 3 tabloya katılmanız gerekir ( JOIN - ONve tuşlarını kullanarak WHERE)

Ayrıntılar için kullanma kılavuzuna bakın UPDATE.


0

böyle bir şey yapmalısın:

UPDATE C 
  set column1=t.firstTab, column2=t.secondTab, column3=t.thirdTab 
  from (select A.column1 as firstTab, B.column2 as secTab, 
              (A.column1 + B.column2) thirdTab 
        from A
        join B  on ...
        where ... ) as t
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.