Обновление Postgres, если не в другой таблице

Таблица A имеет столбцы: id, user_id, name

Таблица B содержит столбцы: id, user_id, title

Я хочу обновить все, где name = 'foo' и для каждой из записей, проверьте, есть ли соответствие user_id в таблице B. Не обновляйте запись, если user_id существует в таблице B.

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 к названию Foo,

2 ответа

Решение

С 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);

Предполагая, что вы на самом деле имеете в виду:

Я хочу обновить все A с именем = 'foo' ... не обновлять запись, если user_id существует в таблице B.

Смелый акцент на моем исправлении.

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 ценности.

Другие вопросы по тегам