sql - 更新其他表中没有匹配项的行

标签 sql postgresql sql-update exists

我有两个表:

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'  

我想用 name = 'foo' 更新所有 A,其中表 B 中没有匹配的 user_id。如果 user_id,则不要更新该行存在于表B中。

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

最佳答案

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 相反。见:

关于sql - 更新其他表中没有匹配项的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17997231/

相关文章:

mysql - 如何仅更改mysql行上多个相同值的第一个字符串

MYSQL更新整数/位数据类型字段中唯一的第x个数字

MySQL:如何使用过滤向量列表进行更新?

mysql - 使用发票数据更新客户表

php - 无法通过 PHP 连接到远程 PostgreSQL 服务器

mysql - Rails 中的多个数据库连接

sql - Postgresql 查询以检索具有按深度排序的所有子项的父项

sql - 从 plpgsql 函数返回一个选择

javascript - 为什么同一个 SQL 查询可能在 SQL Developer 和代码中返回不同的结果?

sql - 跨不同值生成的增量数