Postgresql

來自子查詢的 UPDATE 更新不應更新的行

  • April 6, 2016

使用 PostgreSQL,我想更新一列。如何更新的資訊在另一個表中。

我的嘗試是這樣,但它也會更新我不想更新的行:

update table_1
set column_x = (
   select table_2.rename
   from table_2    
   where table_2.rename IS NOT NULL 
       and table_1.id = table_2.id)

如何修改查詢?

也許這有助於解釋我的問題:http ://www.sqlfiddle.com/#!15/318fb/1

使用FROM子句加入更多表:

UPDATE table_1 t1    -- alias optional
SET    column_x = t2.rename
FROM   table_2 t2
WHERE  t2.rename IS NOT NULL  -- assuming you actually meant t1
AND    t2.id = t1.id;

這將table_2a - 中的行連接到由使其有效CROSS JOIN的條件過濾。t2.id = t1.id``INNER JOIN

這樣,在另一個表中沒有匹配的行根本不會被觸及 - 不像您的帶有相關子查詢的查詢。

帶有擴展展示的SQL Fiddle 。

您還必須了解 NULL、空字元串和“無行”(在相關子查詢中導致 NULL)之間的區別。

手冊中的詳細資訊。

引用自:https://dba.stackexchange.com/questions/134552