Oracle中用一张表的字段更新另一张表的字段

今天在做项目的过程中,发现开发库中某张表的某字段有许多值是空的,而测试库中该字段的值则是有的。

那么,有什么办法能将测试库中该字段的值更新到开发库中呢?

SQL Server中这是比较容易解决的,而Oracle中就不知道方法了。

SQL Server中类似问题的解决方法

后来只好用最笨的方法:

首先,将数据复制到Excel;(假设称测试库的表为A--含有数据)

然后,在开发库中建立和表A同结构的表B;(这里为了导入数据的简单,我对表B的结构进行了改造,只有两个字段)

图 表B的数据

再利用PL SQL的导入功能将这些数据导入到表B中(此时表B的数据为表A的子集);

接下来要做的是将表B的数据更新到开发库中相应的表中,假设称之为表D;

这里用到了oracle中的Merge into。

SQL Code如下:

MERGE INTO D
USING B
ON (D.CATEGORY_NAME = B.CATEGORY_NAME /*AND B IS NULL*/)
WHEN MATCHED THEN
  UPDATE SET
  RELAVANCE_PROPETY = B.RELAVANCE_PROPETY

关于MERGE INTO的详细讲解

但是,在此过程中发生了错误:

错误1:

在执行MERGE INTO操作的时候,发生了ORA-30926错误。

该错误的原因是什么?如何解决呢?

原因:

  百度了一下,大体知道是因为表B含有重复的Key,这里的Key就是条件中的CATEGORY_NAME,从条件:

D.CATEGORY_NAME = B.CATEGORY_NAME

可以看出。

补充:

  

解决:

  知道了上面的原因,我们要做的就是把有重复CATEGORY_NAME的记录删除。

用下面的SQL获得哪些CATEGORY_NAME的值重复了:

SELECT CATEGORY_NAME,COUNT(1) FROM B
GROUP BY CATEGORY_NAME
HAVING COUNT(1) >1

效果如下:

接下来是删除重复的数据,执行下面语句进入编辑模式:

SELECT *
FROM B MM
WHERE MM.CATEGORY_NAME IN
(SELECT CATEGORY_NAME FROM B
GROUP BY CATEGORY_NAME
HAVING COUNT(1) >1)
FOR UPDATE

效果如下:

然后选择需要删除的数据。

我们这边的表只有2个字段,所以可以用group by结果转存到临时表,再用临时表覆盖原表的方法洗数据。

但更多的情况是:(1)字段多于两个;(2)且某个字段相同的记录,别的字段可能不同(即不完全相同)

错误2:

在给B表做备份时,想整表复制到新表中,原来经常使用:

select * into new_table from old_table

去做这样的事情。预期的结果是:在复制表结构的同时,将表中的数据同时复制到new_table中。

结果,出现了下面的错误:

为什么呢?

原因:

  原来select into是PL/SQL的赋值语句!而这里的使用格式和赋值的格式是不一致的。

所以,会报ORA-00905错误。

解决:

  那么,PL/SQL中如何解决类似问题的呢?

那就是用create table,语句如下:

--复制表结构和数据
CREATE TABLE B1 AS SELECT * FROM B;

AS后接一个查询语句。

时间: 2024-08-09 10:43:38

Oracle中用一张表的字段更新另一张表的字段的相关文章

将一个表的字段更新到另一个表中去

描述 做一个需求需要记录用户留下签字意见时的职位信息,并且签字意见中留下的职位信息不随他的职位的调动变化而变化.在标准产品的签字意见表里面没有记录职位信息的字段,这就需要我们添加一个字段用于存储当前操作者的职位信息,对于新的数据我们可以在插入签字意见的时候一并插入.但是对于历史数据,我们就需要通过SQL来更新,这样在升级客户系统的时候直接运行一个SQL脚本就将历史数据的职位字段更新为记录的操作者当前的职位信息. 假设表HRM表示用户表,结构如下: 字段名字 类型 备注 ID NUMBER 用户i

UPDATE语句:将一个表里的字段更新到另一个表的字段里的语句

update table2 b,(select b.area_id as arid,sum(a.user_amount) as bcount from table1 a,table2 b where a.user_area=b.area_id group by arid) c set b.count=c.bcount where b.area_id=c.arid;

Oracle 11g数据库详解(2015-1-18更新)

Oracle 11g数据库详解 整理者:高压锅 QQ:280604597 Email:[email protected] 大家有什么不明白的地方,或者想要详细了解的地方可以联系我,我会认真回复的 1   简介 数据库操作主要有以下几步: 1.  启动.停止数据库 2.  连接.断开数据库 3.  创建.修改.删除数据库用户 4.  表空间 5.  新建.修改.删除表 6.  查询.插入.修改.删除表数据 7.  新建.修改.删除视图 8.  新建.修改.删除存储过程 9.  新建.修改.删除触发

Oracle 11g数据库详解(2015-02-28更新)

Oracle 11g数据库详解 整理者:高压锅 QQ:280604597 Email:[email protected] 大家有什么不明白的地方,或者想要详细了解的地方可以联系我,我会认真回复的 1   简介 数据库操作主要有以下几步: 1.  启动.停止数据库 2.  连接.断开数据库 3.  创建.修改.删除数据库用户 4.  表空间 5.  新建.修改.删除表 6.  查询.插入.修改.删除表数据 7.  新建.修改.删除视图 8.  新建.修改.删除存储过程 9.  新建.修改.删除触发

Oracle两张表关联批量更新其中一张表的数据

Oracle两张表关联批量更新其中一张表的数据 方法一(推荐): UPDATE 表2 SET 表2.C = (SELECT B FROM 表1 WHERE 表1.A = 表2.A) WHERE EXISTS (SELECT 1 FROM 表1 WHERE 表1.A = 表2.A); 尤其注意最后的外层where条件尤为重要,是锁定其批量更新数据的范围. 方法二: MERGE INTO 表2 USING 表1 ON (表2.A = 表1.A) -- 条件是 A 相同 WHEN MATCHED TH

update忘了加where条件,不小心把oracle数据库里某张表的全表数据都更新了怎么办?

问题描述:数据库突然出问题了,一张物资价格表全部更新成了同一个价格,13万条数据 跟大家分享一下我自己跳的坑,希望对遇到类似问题的小伙伴有一点点帮助.ps:属于技术比较low的,所以自己进的坑比较深,解决方法可以直接看6和8 1.首先客户有数据库备份,每天凌晨都有数据库备份,我们没有dba权限,客户通过数据库监控日志查出18号有一个13万数据的update没有加where条件,给了我备份的数据库文件. 2.创建了新的表空间,表用户,导入18号的数据库(我的电脑上装了oracle服务) eg:创建

oracle中用SQL语句创建和管理表

表名和列名的命名规则: 必须以字母开头 必须在1-30个字符之间 只能包含A-Z,a-z,0-9,_,$,# 不能与用户定义的其它对象重名 不能使用ORACLE的保留字 创建前具备的条件: CREATE TABLE权限 建表时必须指定: 表名 列名,列的数据类型,最大长度 数据类型: varchar2(size) 变长字符型(最大长为4000字符) char(size)  定长字符型(最大2000字符) number(p,s)  数值型 date   日期型 long   变长大字符型(最大2G

Oracle 中用一个表的数据更新另一个表的数据

Oracle 中用一个表的数据更新另一个表的数据 分类: SQL/PLSQL2012-05-04 15:49 4153人阅读 评论(1) 收藏 举报 oraclemergesubqueryinsertnull 有下面两个表:将表tab1中id值与和表tab2中id值相同的行的val更新为tab2中val的值.select * from tab1; select * from tab2 最容易犯的错误是:update tab1 set val=(select val from tab2 where

如何使用MySQL一个表中的字段更新另一个表中字段

这篇文章主要介绍了如何使用MySQL一个表中的字段更新另一个表中字段,需要的朋友可以参考下 1,修改1列 ? 1 2 3 update student s, city c set s.city_name = c.name where s.city_code = c.code; 2,修改多个列 ? 1 2 3 update a, b set a.title=b.title, a.name=b.name where a.id=b.id ?子查询 ? 1 update student s set ci