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