更新Oracle数据库

时间:2015-12-22 21:58:17

标签: sql oracle sql-update inner-join oracle12c

我有以下查询,其中我尝试放置所有内容,以便我只需要执行一次优化查询( oracle 12c DBMS )。

update PersonStatus s
set s.status = 4
where exists (
    select 1 from PersonStatus s1
      inner join Person p
        on s1.id = p.id
    where p.details = 'california' and s1.status = 0 and s1.age in (1,2,3,4,5)
)

表:

Person (id, details)
PersonStatus(id, status, age)

其中PersonStatus中的id引用Person中的id。请注意,我仅为演示目的简化/重命名了表格。

基本上,我只想更新符合条件的行(....),但我似乎没有得到它。

当我执行它时,它更新了表中的所有行,但我需要的是只更新给定列表中具有年龄的那些行(1,2,3,4,5)。 这适用于 Oracle 12c 数据库。

知道为什么这样的行为是这样的?建议表示赞赏。

===== 在MySQL中。我的以下查询工作正常:

update PersonStatus s
 inner join Person p on s.id = p.id
 set s.status = 4;
 where p.details = 'california' and s.status = 0 and s.age in (1,2,3,4,5)

我尝试在Oracle 12c中实现这一目标。

2 个答案:

答案 0 :(得分:1)

我认为以下修改后的查询应该适合您

update PersonStatus s
   set s.status = 4
 where exists (select 1
                 from Person p
                where s.id = p.id
                  and p.details = 'california'
             )
  and s.status = 0
  and s.age in (1,2,3,4,5)
;

答案 1 :(得分:0)

我认为你只想要一个相关的子查询。换句话说,您在子查询中不需要PersonStatus

update PersonStatus s
    set s.status = 4
    where exists (select 1
                  from Person p
                  where s.id = p.id and
                        p.details = 'california' and
                        s.status = 0 and s.age in (1,2,3,4,5)
                 );

我猜这是你正在寻找的逻辑。