Perbarui kolom dengan data dari tabel lain

11

Saya sedang mengerjakan masalah yang rumit, tetapi saya akan menyederhanakannya untuk masalah ini.

Saya punya dua meja

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

dan saya ingin memperbarui yang ketiga:

C [ID, column1, column2,column3] 

Saya memperbarui tabel ketiga lainnya menggunakan kueri ini.

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 ; 

Saya mendapatkan:

UPDATE 0

Ketika saya menjalankan kueri ini:

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

Saya mendapat hasil. Apakah saya melewatkan sesuatu?

Contoh data: http://sqlfiddle.com/#!15/e4d08/5

pengguna3001937
sumber

Jawaban:

19

Bentuk yang tepat adalah (dengan asumsi pg versi 9.3 saat ini karena kurangnya informasi):

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);

WHEREKlausa terakhir adalah opsional untuk menghindari pembaruan kosong yang tidak akan mengubah apa pun (tetapi masih menulis versi baris baru dengan biaya penuh).

ypercube sudah memberikan penjelasan dasar dalam komentarnya:

Anda tidak mendapatkan duplikasi. Tabel turunan Anda adalah penggabungan silang Adan B(yaitu tanpa syarat penggabungan ) dan kemudian memilih baris arbitrer ( LIMIT 1tanpa ORDER BY) Itu kemudian menggunakan nilai-nilai dari baris yang sewenang-wenang untuk memperbarui semua baris tabel C. Jika Anda ingin nilai yang berbeda digunakan untuk baris C yang berbeda, Anda harus bergabung dengan 3 tabel (menggunakan JOIN - ONdan WHERE)

Lihat manual pada UPDATEuntuk detail.

Erwin Brandstetter
sumber
0

Anda harus melakukan sesuatu seperti ini:

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
dimitar
sumber