[英]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。
提前致谢,马克
您在FROM
和UPDATE
子句中重复该表。
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.