2012-11-20 127 views
20

我想將表0123'的一列val1中的所有值複製到另一個表table2的一列val2。我試圖在PostgreSQL的命令:使用PostgreSQL中另一個表的列更新表的列

update table2 
set val2 = (select val1 from table1) 

但我得到這個錯誤:

ERROR: more than one row returned by a subquery used as an expression

是否有其他要做到這一點?

回答

47

UPDATE查詢確實應該是這樣的:

UPDATE table2 t2 
SET val2 = t1.val1 
FROM table1 t1 
WHERE t2.table2_id = t1.table2_id 
AND t2.val2 IS DISTINCT FROM t1.val1 -- optional, to avoid empty updates 

你有它的方式,有兩個表的各行之間沒有聯繫。 table2中的每一行都將從table1獲取。這是沒有意義的(以一種昂貴的方式)並且也觸發了語法錯誤,因爲在這個地方的子查詢表達式只允許返回一個單一的值。

  • 我通過加入table2_id上的兩個表來解決這個問題。把它換成實際上將兩者聯繫起來的東西。

  • 我重寫了UPDATE加入table1(與FROM子句),而不是運行相關的子查詢,因爲它定期快一個數量級。
    它還可以防止在table1中找不到匹配行的情況下table2.val2無效。相反,沒有什麼發生這種查詢形式的行。

  • 您可以在FROM列表中包含所有相同的東西,您可以將其包含在普通SELECT(如多個表或子查詢)中。 Per documentation:

  • 最後WHERE子句防止更新,不會改變任何東西 - 這實際上總是一個好主意(全部費用,但沒有收穫 - 異國情調的例外情況)。
+0

這很棒,作爲一種魅力。謝謝! –

0

更新表1組table1_column = table2.column從表2表2,其中table1_id = table2.id

  1. 沒有爲表1使用別名。
  2. 桌子是桌子1桌子2
相關問題