繁体   English   中英

用于更新/替换更新太多记录的 SQL 查询

[英]SQL query for update/replace updating too many records

我是一名 SQL 新手,被“提名”参与一个项目,为客户更新一些帐户设置。
基本上我需要用 user_settings 表上的“NEWACCESS”替换设置(“OLDACCESS”)。 但是,我只想为我们的一部分用户(公司 ID 10 的用户拥有“OLDACCESS”。拥有“OLDACCESS”的所有其他用户更新/替换为“NEWACCESS”。应该保持不变。

访问设置存储在 user_settings 表中,用户的帐户配置文件信息(例如公司 ID)存储在 soft_users 表中。 两个表都在同一个数据库中。

幸运的是,我们有一个测试数据库,我可以在对我们的生产系统进行更改之前对其进行练习。 我想出了下面的查询来使用替换进行更新(从 OLDACCESS 到 NEWACCESS),然后加入“soft_users”表以允许我执行 where 子句来查找公司 ID 为 10 且具有 OLDACCEES 的用户。 问题是我的脚本正在将所有具有 OLDACCESS 的用户(具有任何公司 ID)更新为 NEWACCESS,而不仅仅是公司 10 中拥有 OLDACCESS 的用户。 :[

这几乎就像查询正在执行更新/替换但完全忽略了连接和位置部分。 很确定我正在做一些完全符合我新手的事情。 有人可以帮助我提供提示以显示我哪里出错了吗?

update user_settings
set access = replace(user_settings.access::varchar, 'OLDACCESS'::varchar, 'NEWACCESS'::varchar)
from soft_users
join user_settings us
on us.user_id = soft_users.user_id
where soft_users.company_id = '10' and us.access like 'OLDACCESS%'

注意:不确定是否重要,但数据库是 PostgreSQL。

提前致谢,马克

您在FROMUPDATE子句中重复该表。

update user_settings us
    set access = replace(us.access, 'OLDACCESS', 'NEWACCESS')
from soft_users su
where us.user_id = su.user_id and
      su.company_id = 10 and
      us.access like 'OLDACCESS%';

此外,应该不需要将字符串常量转换为字符串。 us.access也是如此。

只是给你另一个选择:

您想更新用户设置,但仅更新用户公司为 10 的设置。因此,直接的更新语句将是

update user_settings
  set access = replace(access, 'OLDACCESS', 'NEWACCESS')
where access like 'OLDACCESS%'
and user_id in (select user_id from soft_users where company_id = 10);

这就是 SQL 应该如何工作的; 您尝试像用英语描述任务一样编写它:满足某些条件的情况下更新用户设置。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM