表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
。
答案 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);