一张表部分UPDATE到另一张表,报错无法更新,报错1407值为NULL。

无情答题机器 2017-06-11 07:40:37
求教大神,现在我有表a和表b,要把a更新到b里去,并实现:
Request 1: 当且仅当a.ID=b.ID, a.ID_TIME=b.ID_TIME时才将a某行的VALUE更新到b的对应行;
Request 2: 如果a某行的ID和ID_TIME是b里没有的,那么这一行数据不更新到表b;
Request 3: 如果b某行的ID和ID_TIME是a里没有的,那么表b的该行不更新,维持原状。
=============================================================================
例子:
a
ID ID_TIME VALUE
1 2017-06-07 10
2 2017-06-07 20
1 2017-06-08 30
2 2017-06-08 40
a表约束条件是VALUE不能为NULL。
b
ID ID_TIME VALUE
1 2017-06-07 100
2 2017-06-07 110
3 2017-06-09 300
b表约束条件是VALUE不能为NULL。

在这个例子里,a的ROW1和ROW2会更新到b里,ROW3和ROW4不会更新到b里,表b的ROW3不会改变,即结果能实现:
b
ID ID_TIME VALUE
1 2017-06-07 10
2 2017-06-07 20
3 2017-06-09 300

我自己尝试了如下方法,报了错。
尝试:
update b set value= (select value from a where a.id= b.id and a.id_time= b.id_time)
结果报错,提示:SQL错误[1407]: ORA-01407: 无法更新,("B"."VALUE")为NULL
我考虑了下,应该是表b的第三行在表a中没有找到,会赋给表b的第三行一个NULL,和约束冲突了。我想要的效果是第三行既然在表a中没找到,就不更新。

是不是还要加上什么约束才可以?比如用exists,或者是inner join?请大神不吝赐教!
...全文
706 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
无情答题机器 2017-06-13
  • 打赏
  • 举报
回复
引用 8 楼 wmxcn2000 的回复:
[quote=引用 6 楼 WelcomeSQLwORLD的回复:][quote=引用 3 楼 wmxcn2000 的回复:] -- 换成你的表,就是这样写; update b set value= (select value from a where a.id= b.id and a.id_time= b.id_time) where exists(select 1from a where a.id= b.id and a.id_time= b.id_time)
版主,我还有一个问题,是否要换一个帖子请教。[/quote] 不用,可以在这里直接@我就可以了。[/quote] 好的,那就太谢谢版主了,问题如下: 求教,现在我有表a、表b、表c和表d,表b、表c和表d分别存储着部分列属性相同的数据,需要将表b、表c和表d进行联合查询,分组求和,直接举例子吧,否则太抽象。 ============================================================================= 例子: 表a存储了不同销售大区的ID号、每天的时间,以及大区销售额。 销售大区ID 时间 大区销售额 1 2017-06-07 100 2 2017-06-07 200 3 2017-06-08 300 4 2017-06-08 400 a表约束条件是销售大区ID为主键,且销售大区ID、时间、销售额不能为NULL。 表b存储了每个销售大区的ID号和销售大区名称的对应关系。 销售大区ID 销售大区名称 1 湖北 2 湖南 3 北京 4 江苏 b表约束条件是同表a。 表c存储了每个销售大区的名称和该大区内销售员的ID号的对应关系。 销售员ID 销售大区名称 001 湖北 002 湖北 003 湖南 004 湖南 005 北京 006 北京 007 江苏 c表约束条件是同表a。 表d存储了每个销售员的ID号、每天的时间,以及个人销售额。 销售员ID 时间 个人销售额 001 2017-06-07 10 002 2017-06-07 10 003 2017-06-07 20 004 2017-06-08 30 005 2017-06-08 20 006 2017-06-08 25 007 2017-06-08 30 ... d表约束条件是同表a。 现在要做的,就是根据b、c和d表,得到每个大区每天的大区销售额,存入表a。 我想的代码是: update a set 大区销售额 = (SELECT sum(个人销售额) from b, c, d where b.销售大区名称=c.销售大区名称 and a.销售大区ID=b.销售大区ID and c.销售员ID=d.销售员ID GROUP BY b.销售大区ID, d.时间) where exists(select 1 from b, c, d where b.销售大区名称=c.销售大区名称 and a.销售大区ID=b.销售大区ID and c.销售员ID=d.销售员ID) 应该是有问题的,报错提示:单行子查询返回多个行。 请教版主,应该如何修改?上面的句子合理么?
卖水果的net 2017-06-12
  • 打赏
  • 举报
回复
引用 6 楼 WelcomeSQLwORLD的回复:
[quote=引用 3 楼 wmxcn2000 的回复:] -- 换成你的表,就是这样写; update b set value= (select value from a where a.id= b.id and a.id_time= b.id_time) where exists(select 1from a where a.id= b.id and a.id_time= b.id_time)
版主,我还有一个问题,是否要换一个帖子请教。[/quote] 不用,可以在这里直接@我就可以了。
无情答题机器 2017-06-12
  • 打赏
  • 举报
回复
引用 4 楼 jdsnhan 的回复:
acol是他随手写了一个列名,对应到你的需求,列名就是value
嗯,弄懂了,多谢兄台。
无情答题机器 2017-06-12
  • 打赏
  • 举报
回复
引用 3 楼 wmxcn2000 的回复:
-- 换成你的表,就是这样写; update b set value= (select value from a where a.id= b.id and a.id_time= b.id_time) where exists(select 1from a where a.id= b.id and a.id_time= b.id_time)
版主,我还有一个问题,是否要换一个帖子请教。
无情答题机器 2017-06-12
  • 打赏
  • 举报
回复
引用 3 楼 wmxcn2000 的回复:
-- 换成你的表,就是这样写; update b set value= (select value from a where a.id= b.id and a.id_time= b.id_time) where exists(select 1from a where a.id= b.id and a.id_time= b.id_time)
谢谢版主,太给力了!
jdsnhan 2017-06-12
  • 打赏
  • 举报
回复
acol是他随手写了一个列名,对应到你的需求,列名就是value
卖水果的net 2017-06-12
  • 打赏
  • 举报
回复
-- 换成你的表,就是这样写; update b set value= (select value from a where a.id= b.id and a.id_time= b.id_time) where exists(select 1from a where a.id= b.id and a.id_time= b.id_time)
无情答题机器 2017-06-12
  • 打赏
  • 举报
回复
引用 1 楼 wmxcn2000 的回复:
加exists update a set acol = (select bcol from b where a.id = b.id) where exists (select 1 from b where a.id = b.id)
谢谢。我现在是更新表b,是把你这里的a和b互换么,acol是指什么呢?虚心求教
卖水果的net 2017-06-11
  • 打赏
  • 举报
回复
加exists update a set acol = (select bcol from b where a.id = b.id) where exists (select 1 from b where a.id = b.id)

17,141

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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