PostgreSQL'de alt sorgulardan Güncelle veya Ekle (birden çok satır ve sütun)


106

Postgres'te böyle bir şey yapmaya çalışıyorum:

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

Ancak, belgelerde belirtildiği gibi postgres 9.0 ile bile 1. nokta mümkün değildir ( http://www.postgresql.org/docs/9.0/static/sql-update.html )

Ayrıca 2. nokta çalışmıyor gibi görünüyor. Şu hatayı alıyorum: alt sorgu yalnızca bir sütun döndürmelidir.

Umarım birinin benim için bir çözümü vardır. aksi takdirde sorgular biraz zaman alacaktır :(.

Bilginize: Birkaç tablodan farklı sütunlar seçmeye ve bunları geçici bir tabloya kaydetmeye çalışıyorum, böylece başka bir uygulama hazırlanan verileri kolayca alabilir.

Yanıtlar:


175

GÜNCELLEME için

Kullanım:

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

INSERT için

Kullanım:

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

VALUESINSERT değerlerini doldurmak için bir SEÇİM kullanıyorsanız sözdizimine ihtiyacınız yoktur .


1
Biri başarısız olursa, diğeri bir hata atmadan (her satır için bağımsız olarak) kullanılacak şekilde Güncelle ve Ekle'yi birleştirmek mümkün mü? Bunun soru için daha eksiksiz bir çözüm olacağını düşünüyorum (örneğin: stackoverflow.com/a/6527838/781695 )
kullanıcı

26

OMG Ponies'in cevabı mükemmel çalışıyor, ancak daha karmaşık bir şeye ihtiyacınız olması durumunda, işte biraz daha gelişmiş bir güncelleme sorgusu örneği:

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;

1
Sen en
iyisisin

1
mükemmel. bu, güncellenmiş tablonun kendisini içeren bir koşula göre bir alt küme seçmeniz gerektiğinde en iyi şekilde çalışır.
mithicalcoder

@David Namenyi bu sorguyu açıklar mısınız?
Chintan Pathak

15
UPDATE table1 SET (col1, col2) = (col2, col3) FROM othertable WHERE othertable.col1 = 123;
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.