4

我有两张桌子:

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'  

我想用表 Bname = 'foo'中没有匹配的地方更新所有 A。如果表 B 中存在,user_id请不要更新该行。user_id

所以在这种情况下,它只会更新Jim为名称“foo”。

4

2 回答 2

7

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

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

这也可以按预期使用NULL值。与NOT IN. 看:

于 2013-08-01T17:29:02.623 回答
4

使用导轨:

user_ids_in_table_b = MobelB.pluck(:user_id)

ModelA.where.not(user_id: user_ids_in_table_b).update_all(name: 'foo')

您需要在应用程序中将 MobelA 和 MobelB 模型名称更改为您的模型名称。

在纯 SQL 中:

UPDATE table_a 
SET name = 'foo' 
WHERE user_id NOT IN (SELECT user_id FROM table_b);
于 2013-08-01T14:53:56.177 回答