关于update的顺序问题

cpp_1 2019-07-30 08:07:12


我现在有一个这样的数据结构 S1-S4全是INT型的

UPDATE aaa SET s1 ='1', s2 ='2', s3 ='3', s4 =s1+s2+s3

我执行这样一句 update ,它S4是先用S1,S2,S3的原值做加法,执行后S4并不是6,还是0

有没有可以先赋值,后做+的

...全文
351 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
AHUA1001 2019-08-01
  • 打赏
  • 举报
回复
前边都已经知道了 s1 =1, s2 =2, s3 =3,后边是不是可以直接携程s4 = 1 + 2 + 3。
minsic78 2019-07-31
  • 打赏
  • 举报
回复
又想了下,楼主你看这样行不行:
UPDATE aaa
   SET (s1, s2, s3) = (SELECT 1, 2, 3 FROM DUAL),
       s4 =
          (WITH t AS (SELECT 1 s1, 2 s2, 3 s3 FROM DUAL)
           SELECT t.s1 + t.s2 + t.s3
             FROM t)
 WHERE id = 100
当然如果你要更新所有行一样的话,后面的where条件就不需要了
minsic78 2019-07-31
  • 打赏
  • 举报
回复
引用 5 楼 minsic78 的回复:
[quote=引用 4 楼 cpp_1 的回复:] 叹。。。 实在不行,我就只能分二句写了 本来还想有没有在一句里可以解决的 主要是现在更新数据比交多,一次10几万条,现在就要分成双倍了
如果不是业务需求,不需要两倍吧?10几万条插入后,再一次更新这10几万条的s4不行吗?[/quote] 当然如果插入的记录比较多,最后一次性批量更新是否合适还要考虑下。
minsic78 2019-07-31
  • 打赏
  • 举报
回复
引用 4 楼 cpp_1 的回复:
叹。。。 实在不行,我就只能分二句写了 本来还想有没有在一句里可以解决的 主要是现在更新数据比交多,一次10几万条,现在就要分成双倍了
如果不是业务需求,不需要两倍吧?10几万条插入后,再一次更新这10几万条的s4不行吗?
cpp_1 2019-07-31
  • 打赏
  • 举报
回复
叹。。。 实在不行,我就只能分二句写了 本来还想有没有在一句里可以解决的 主要是现在更新数据比交多,一次10几万条,现在就要分成双倍了
  • 打赏
  • 举报
回复
这样写 应该是 同时 set的吧
minsic78 2019-07-31
  • 打赏
  • 举报
回复
不好意思,上面漏了加上原表的s0:
UPDATE aaa t
   SET (s1, s2, s3) = (SELECT 1, 2, 3 FROM DUAL),
       s4 =
          (WITH t1 AS (SELECT 1 s1, 2 s2, 3 s3 FROM DUAL)
           SELECT t1.s1 + t1.s2 + t1.s3 + t2.s0
             FROM t1,aaa t2 where t2.id=t.id)
 WHERE id = 100
minsic78 2019-07-31
  • 打赏
  • 举报
回复
引用 8 楼 cpp_1 的回复:
UPDATE aaa SET (s1, s2, s3) = (SELECT 1, 2, 3 FROM DUAL), s4 = (WITH t AS (SELECT 1 s1, 2 s2, 3 s3 FROM DUAL) SELECT t.s1 + t.s2 + t.s3 FROM t) WHERE id = 100 这个方式我试了,如果是对赋值字段是可以用,但如果最后的值是赋值字段+原字段的值就不行了 比如,我现在表里还有一个s0字段 现在条件变成 s1 ='1', s2 ='2', s3 ='3', s4 =s1+s2+s3 +s0 这样,用现在这个方式就不能用了,因为S0是原来表里数据
加点料就可以了:
UPDATE aaa t
   SET (s1, s2, s3) = (SELECT 1, 2, 3 FROM DUAL),
       s4 =
          (WITH t1 AS (SELECT 1 s1, 2 s2, 3 s3 FROM DUAL)
           SELECT t1.s1 + t1.s2 + t1.s3
             FROM t1,aaa t2 where t2.id=t.id)
 WHERE id = 100
cpp_1 2019-07-31
  • 打赏
  • 举报
回复
UPDATE aaa SET (s1, s2, s3) = (SELECT 1, 2, 3 FROM DUAL), s4 = (WITH t AS (SELECT 1 s1, 2 s2, 3 s3 FROM DUAL) SELECT t.s1 + t.s2 + t.s3 FROM t) WHERE id = 100 这个方式我试了,如果是对赋值字段是可以用,但如果最后的值是赋值字段+原字段的值就不行了 比如,我现在表里还有一个s0字段 现在条件变成 s1 ='1', s2 ='2', s3 ='3', s4 =s1+s2+s3 +s0 这样,用现在这个方式就不能用了,因为S0是原来表里数据
minsic78 2019-07-30
  • 打赏
  • 举报
回复
引用 1 楼 minsic78 的回复:
分两句写吧……
或者就用PL/SQL,匿名块等……
minsic78 2019-07-30
  • 打赏
  • 举报
回复
分两句写吧……

3,497

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 高级技术相关讨论专区
社区管理员
  • 高级技术社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧