如果不在其他表中,则更新Postgres

时间:2013-08-01 14:45:29

标签: sql postgresql sql-update exists

表A包含列:id,user_id,name

表B包含列:id,user_id,title

我想要更新name = 'foo'的所有A,并且对于每个记录,检查表B中是否存在匹配的user_id。如果{{不要更新记录1}}存在于表B中。

user_id

因此,在这种情况下,它只会将TABLE A id | user_id | name ------+-----------+------- 1 | 122 | 'Bill' 2 | 123 | 'Jim' 3 | 124 | 'Sally' TABLE B id | user_id | title ------+-----------+------- 1 | 122 | 'Boss' 2 | 999 | 'Manager' 3 | 124 | 'Worker' 更新为名称Jim

2 个答案:

答案 0 :(得分:5)

假设你的意思是:

  

我想更新所有A with name ='foo'...如果表B中存在user_id,则不更新记录。

大胆强调我的修复。

NOT EXISTS应该是最简单,最安全的最快:

UPDATE tbl_a a
SET    name = 'foo' 
WHERE  NOT EXISTS (SELECT 1 FROM tbl_b b WHERE b.user_id = a.user_id);

这也适用于NULL值。

答案 1 :(得分:3)

使用Rails:

user_ids_in_table_b = TableB.all.map(&:user_id)

TableA.where('user_id NOT IN (?)', user_ids_in_table_b).update_all(name: 'foo')

您需要更改TableA& TableB为您的应用中的模型名称建模名称。

在纯SQL中:

UPDATE table_a 
SET name = 'foo' 
WHERE user_id NOT IN (SELECT user_id FROM table_b);