先建立一个结构一模一样的表emp1,并为其插入部分数据
update掉emp1中的部分数据
然后我们试着使用emp1中数据来更新emp中sal 和 comm这两列数据。 我们可以这么写
请你尤其注意这里的where子句,你可以尝试不写where子句来执行以下这句话,你将会使得emp中的很多值变成空。 这是因为在oracle的update语句中如果不写where子句,oracle将会默认的把所有的值全部更新,即使你这里使用了子查询并且某在 值并不能在子查询里找到,你就会想当然的以为,oracle或许将会跳过这些值吧,你错了,oracle将会把该行的值更新为空。 我们还还可以这么写:
这里的表是一个类视图。当然你执行时可能会遇到如下错误: ERROR 位于第 2 行: ORA-01779: 无法修改与非键值保存表对应的列 这是因为新建的表emp1还没有主键的缘故 下面增加一个主键
执行之后 在执行前面的语句就能成功。 这里我们总结一下: 在oracle中不存在update from结构,所以遇到需要从另外一个表来更新本表的值的问题的时候,有两种解决的办法: 一种是使用子查询,使用子查询时一定要注意where条件(一般后面接exists子句),除非两个表是一一对应的,否则where条件必不可少, 遗漏掉where条件时可能会导致插入大量空值。 另外一种是类视图的更新方法,这也是oracle所独有的。先把对应的数据全部抽取出来,然后更新表一样更新数据,这里需要注意的是,必须保证表的 数据唯一型。 |
|