PostgreSQLのサブクエリからの更新または挿入(複数の行と列)


106

私は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)

しかし、ドキュメント(http://www.postgresql.org/docs/9.0/static/sql-update.html)で言及されているように、postgres 9.0でもポイント1は不可能です

また、ポイント2が機能していないようです。次のエラーが発生します。サブクエリは1つの列のみを返す必要があります。

誰かが私のための回避策を持っていると思います。それ以外の場合、クエリにはかなりの時間がかかります:(。

参考:別のアプリケーションが準備されたデータを簡単にフェッチできるように、いくつかのテーブルから異なる列を選択して一時テーブルに格納しようとしています。

回答:


175

UPDATEの場合

使用する:

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

INSERTの場合

使用する:

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

VALUESSELECTを使用してINSERT値を設定する場合は、構文は必要ありません。


1
更新と挿入を組み合わせて、1つが失敗した場合、もう1つがエラーをスローせずに使用されるようにすることはできますか(行ごとに独立して)。私はそれが質問に対するより完全な解決策になると思います(例:stackoverflow.com/a/6527838/781695
user

26

OMG Poniesの答えは完全に機能しますが、より複雑なものが必要な場合に備えて、次の例は少し高度な更新クエリの例です。

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
あなたは最高です:) :)
Ashwini

1
完璧。これは、更新されたテーブル自体に関連する条件に基づいてサブセットを選択する必要がある場合に最適に機能します。
mythicalcoder

@David Namenyiはこのクエリを説明できますか?
Chintan Pathak

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.