Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用于更新/替换更新过多记录的SQL查询_Sql_Postgresql - Fatal编程技术网

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

用于更新/替换更新过多记录的SQL查询,sql,postgresql,Sql,Postgresql,我是SQL新手,被“提名”参与一个项目,为客户更新一些帐户设置。 基本上,我需要在用户设置表中将设置(“OLDACCESS”)替换为“NEWACCESS”。但是,我只想为我们的一部分用户(公司ID为10且拥有“OLDACCESS”的用户)将“OLDACCESS”更新/替换为“NEWACCESS”。拥有“OLDACCESS”的所有其他用户应保持不变 访问设置存储在用户设置表中,用户的帐户配置文件信息(如公司ID)存储在软用户表中。两个表位于同一数据库中 幸运的是,我们有一个测试数据库,在对生产系统

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

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

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

这几乎就像是查询在做更新/替换,但完全忽略了连接和where部分。我很确定我在做一些完全符合我的新手风格的事情。有人能帮我提供一些提示来说明我哪里出了问题吗

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%';

此外,应该不需要将字符串常量转换为字符串。对于
美国也是如此。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的工作原理;你试着像用英语描述任务一样编写它:在满足某些条件的情况下更新用户设置。

非常感谢,@gordon linoff!成功了。我学到了一些东西,可以帮助我处理这个和未来涉及SQL的项目。谢谢Thorsten。我也想试试你的SQL语句.我在说错误时出错:“用户id”列不存在这似乎没有什么意义。两个表中都没有用户id吗?正如您仍在学习的一样,您应该处理这个问题并找到错误。我的update语句应该适用于几乎每个DBMS,而带有联接的查询的更新则特定于一个或几个DBMS。我的语句应该首先想到。只有在您如果您在update语句中加入联接,则为其添加联接(通常是因为您希望另一个表同时限制行并为您提供要更新的值)。