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后接一个查询语句。
Oracle中用一张表的字段更新另一张表的字段的更多相关文章
- Oracle-更新字段-一张表的字段更新另一张的表的字段
设备表ops_device_info中的终端号terminal_id值是以 'D'开头的字符串,而终端表ops__terminal_info中的终端号terminal_id是8位字符串, 它们之间是通 ...
- MySQL使用一张表的字段更新另一张表的字段
转自https://blog.csdn.net/anxpp/article/details/73173274 update table1 t1 left join table2 t2 on t1.ke ...
- [SQL Service]从一张表取值更新另一张表字段
1. update table_A set table_A_column = ab.column from table_A aa left join table_B ab on aa.xx = ab ...
- sqlserver 将一个表中的某些字段更新到另一个表中(转载)
来源:https://blog.csdn.net/qq_23888451/article/details/86615555 https://blog.csdn.net/cyxinda/article/ ...
- UPDATE语句:将一个表里的字段更新到另一个表的字段里的语句
update table2 b,(select b.area_id as arid,sum(a.user_amount) as bcount from table1 a,table2 b where ...
- Oracle两张表关联批量更新其中一张表的数据
Oracle两张表关联批量更新其中一张表的数据 方法一(推荐): UPDATE 表2 SET 表2.C = (SELECT B FROM 表1 WHERE 表1.A = 表2.A) WHERE EXI ...
- oracle 用一个表的一个字段更新另一个表的一个字段
案列: 想更新A表的name字段,由于失误,在写这个表的时候,这个字段没有写,发现的时候,已经写了一个多月的数据了.改了之后的过程,会正常的写这个字段, 可是已经写了的数据也不能铲了,重新计算. 好在 ...
- oracle 批量更新之将一个表的数据批量更新至另一个表
oracle 批量更新之将一个表的数据批量更新至另一个表 CreationTime--2018年7月3日17点38分 Author:Marydon Oracle 将一个表的指定字段的值更新至另一个 ...
- Oracle 中用一个表的数据更新另一个表的数据
Oracle 中用一个表的数据更新另一个表的数据 分类: SQL/PLSQL2012-05-04 15:49 4153人阅读 评论(1) 收藏 举报 oraclemergesubqueryinsert ...
随机推荐
- debian下安装AMD驱动
参考:http://blog.sciencenet.cn/blog-296919-464464.html 去AMD官网下载对应的驱动: amd-driver-installer-catalyst-13 ...
- BestCoder Round #81 (div.1)A
水题...就是n的三进制后m位 #include<cstdio> #include<cstring> #include<cstdlib> #include<i ...
- HDU 2509
与HDU 1907一样... #include<cstdio> #include<cstring> #include<cstdlib> #include<io ...
- Timer和counter
什么是Timer,什么是Counter 几乎每个嵌入式板都会有counter和timer,重要性比肩gpio.本质上来看timer和counter几乎是一样的东西,底层都是一个硬件counter,如果 ...
- hadoop-1.2.0安装记录
一.添加用户(各机器均一致) 添加组: sudo addgroup hadoop 添加用户并到组:sudo adduser -ingroup hadoop hadoop 二.ssh无验 ...
- Java String 对 null 对象的容错处理
前言 最近在读<Thinking in Java>,看到这样一段话: Primitives that are fields in a class are automatically ini ...
- Android完美解决输入框EditText隐藏密码打勾显示密码问题
长话短说,一共有两种方法.首先你需要在布局文件里面给EditText设置一个android:inputType="numberPassword"属性.我这里默认规定密码只能是数字了 ...
- Spring Framework 5.0.0.M3中文文档 翻译记录 introduction
翻译自: http://docs.spring.io/spring/docs/5.0.0.M3/spring-framework-reference/htmlsingle/#spring.tld.ha ...
- @ContextConfiguration注解说明
@ContextConfiguration Spring整合JUnit4测试时,使用注解引入多个配置文件单个文件 @ContextConfiguration(Locations="../ap ...
- MongoDB--使用修改器修改文档
可以使用修改器啦修改文档,比如增加.删除文档的键值.使用修改器首先要定位到某个文档, 然后再增加相应的修改选项,需要使用update语句 1.$inc修改器修改文档 > db.users.fin ...