我想將表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
是否有其他要做到這一點?
我想將表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
是否有其他要做到這一點?
你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
子句防止更新,不會改變任何東西 - 這實際上總是一個好主意(全部費用,但沒有收穫 - 異國情調的例外情況)。更新表1組table1_column = table2.column從表2表2,其中table1_id = table2.id
這很棒,作爲一種魅力。謝謝! –