Perbarui atau Sisipkan (beberapa baris dan kolom) dari subkueri di PostgreSQL

106

Saya mencoba melakukan sesuatu seperti ini di postgres:

  • UPDATE table1 SET (col1, col2) = (SELECT col2, col3 FROM othertable WHERE othertable.col1 = 123);

  • INSERT INTO table1 (col1, col2) VALUES (SELECT col1, col2 FROM othertable)

Tetapi poin 1 tidak dimungkinkan bahkan dengan postgres 9.0 seperti yang disebutkan di dokumen ( http://www.postgresql.org/docs/9.0/static/sql-update.html )

Juga poin 2 sepertinya tidak berfungsi. Saya mendapatkan kesalahan berikut: subquery harus mengembalikan hanya satu kolom.

Semoga ada yang punya solusi untuk saya. jika tidak, kueri akan memakan waktu lama :(.

FYI: Saya mencoba memilih kolom yang berbeda dari beberapa tabel dan menyimpannya ke dalam tabel sementara, sehingga aplikasi lain dapat dengan mudah mengambil data yang disiapkan.

dforce
sumber

Jawaban:

175

Untuk UPDATE

Menggunakan:

UPDATE table1 
   SET col1 = othertable.col2,
       col2 = othertable.col3 
  FROM othertable 
 WHERE othertable.col1 = 123;

Untuk INSERT

Menggunakan:

INSERT INTO table1 (col1, col2) 
SELECT col1, col2 
  FROM othertable

Anda tidak memerlukan VALUESsintaks jika Anda menggunakan SELECT untuk mengisi nilai INSERT.

OMG Ponies
sumber
1
Apakah mungkin untuk menggabungkan Update & Insert sehingga jika salah satu gagal, yang lain akan digunakan tanpa menimbulkan kesalahan (secara independen untuk setiap baris). Saya pikir itu akan menjadi solusi yang lebih lengkap untuk pertanyaan tersebut (misalnya: stackoverflow.com/a/6527838/781695 )
pengguna
26

Jawaban OMG Ponies berfungsi dengan sempurna, tetapi jika Anda membutuhkan sesuatu yang lebih kompleks, berikut adalah contoh kueri pembaruan yang sedikit lebih canggih:

UPDATE table1 
SET col1 = subquery.col2,
    col2 = subquery.col3 
FROM (
    SELECT t2.foo as col1, t3.bar as col2, t3.foobar as col3 
    FROM table2 t2 INNER JOIN table3 t3 ON t2.id = t3.t2_id
    WHERE t2.created_at > '2016-01-01'
) AS subquery
WHERE table1.id = subquery.col1;
David Namenyi
sumber
1
You're the best :) :)
Ashwini
1
sempurna. ini bekerja paling baik di mana Anda perlu memilih subset berdasarkan kondisi yang melibatkan tabel yang diperbarui itu sendiri.
mythicalcoder
@David Namenyi dapatkah Anda menjelaskan pertanyaan ini?
Chintan Pathak
15
UPDATE table1 SET (col1, col2) = (col2, col3) FROM othertable WHERE othertable.col1 = 123;
Walter
sumber