从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点似乎不起作用。我收到以下错误:子查询必须仅返回一列。

希望有人对我有解决方法。否则查询将花费大量时间:(。

仅供参考:我正在尝试从多个表中选择不同的列,并将它们存储到临时表中,以便另一个应用程序可以轻松地获取准备好的数据。

Answers:


175

对于更新

用:

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

VALUES如果使用SELECT来填充INSERT值,则不需要语法。


1
是否可以组合使用Update&Insert,以便如果其中一个失败,则将使用另一个而不会引发错误(独立于每一行)。我认为这将是一个更完整的问题解决方案(例如:stackoverflow.com/a/6527838/781695
用户

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

15
UPDATE table1 SET (col1, col2) = (col2, col3) FROM othertable WHERE othertable.col1 = 123;
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.