update set select from 有点想不通

luh713 2013-07-31 10:53:45
oracle中有两个表

a表:
IDNUM SNAME
1 wuxi
2 shanghai
3 zhagnjiakang
4 changzhou

b表:
IDNUM CLIENTNAME REMARKED
1 hhh
2 hhh
3

update b set clientname = (select sname from a where a.idnum= b.idnum)
where remarked = 'hhh';

(select sname from a where a.idnum= b.idnum)这句中的b是带where remarked = 'hhh' 之后的表呢,还是就是b表本身?

set clientname后面不是只能带一个值吗?比如 clientname = (aaaa)是对的,clientname = (aaaa,bbbb)肯定错呀,能不能讲下 上面update的执行顺序?
...全文
1980 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
cosio 2013-08-01
  • 打赏
  • 举报
回复
一对多的更——你那样的语句,肯定会报错!
u010412956 2013-08-01
  • 打赏
  • 举报
回复
where就是过滤,肯定得先过滤不需要更新的了。 clientname = (aaaa,bbbb),这必须错啊,字符串得用''
jdsnhan 2013-08-01
  • 打赏
  • 举报
回复
如果放在外面,则是update更新行的条件,即更新哪些行 放在里面,则是更新内容的条件。
u010412956 2013-08-01
  • 打赏
  • 举报
回复
引用 7 楼 luh713 的回复:
[quote=引用 2 楼 u010412956 的回复:] where就是过滤,肯定得先过滤不需要更新的了。 clientname = (aaaa,bbbb),这必须错啊,字符串得用''
是不是可以这样理解,先过滤掉b表中remarked值不是'hhh'的记录,相当于得到一张新的表,就是需要更新的行,然后从第一条遍历直到最后一条记录。 因为a表中第一条的idnum的值是1,所以 根据条件 把b表中的第一条更新为wuxi; 因为a表中第二条的idnum的值是2,所以 根据条件 把b表中的第二条更新为shanghai;[/quote] 是这个意思
luh713 2013-08-01
  • 打赏
  • 举报
回复
引用 5 楼 forgetsam 的回复:
update b set clientname = (select sname from a where a.idnum= 1) where remarked = 'hhh';
update b set clientname = (select sname from a where a.idnum= 2) where remarked = 'hhh';
update b set clientname = (select sname from a where a.idnum= 3) where remarked = 'hhh';
1,2,3是什么?b每行的b.idnum。所以
update b set clientname = (select sname from a where a.idnum= b.idnum) where remarked = 'hhh';
update b set clientname = (select sname from a where a.idnum= 1) where remarked = 'hhh'; 这样的话,一下更新了两行,就是把'hhh'的两行都更新为同一个值了。
luh713 2013-08-01
  • 打赏
  • 举报
回复
引用 2 楼 u010412956 的回复:
where就是过滤,肯定得先过滤不需要更新的了。 clientname = (aaaa,bbbb),这必须错啊,字符串得用''
是不是可以这样理解,先过滤掉b表中remarked值不是'hhh'的记录,相当于得到一张新的表,就是需要更新的行,然后从第一条遍历直到最后一条记录。 因为a表中第一条的idnum的值是1,所以 根据条件 把b表中的第一条更新为wuxi; 因为a表中第二条的idnum的值是2,所以 根据条件 把b表中的第二条更新为shanghai;
luh713 2013-08-01
  • 打赏
  • 举报
回复
引用 3 楼 cosio 的回复:
一对多的更——你那样的语句,肯定会报错!
实践告诉你 ,语句肯定没有错,下面就是结果。 IDNUM CLIENTNAME REMARKED 1 wuxi hhh 2 shanghai hhh 3
forgetsam 2013-08-01
  • 打赏
  • 举报
回复
update b set clientname = (select sname from a where a.idnum= 1) where remarked = 'hhh';
update b set clientname = (select sname from a where a.idnum= 2) where remarked = 'hhh';
update b set clientname = (select sname from a where a.idnum= 3) where remarked = 'hhh';
1,2,3是什么?b每行的b.idnum。所以
update b set clientname = (select sname from a where a.idnum= b.idnum) where remarked = 'hhh';
  • 打赏
  • 举报
回复
你的语句是有问题的,,肯定是报错的。。系统不知道你到底要更新什么?

17,086

社区成员

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

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