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 ...
随机推荐
- 测试一个函数的运行时间(C++)
#include <ctime> static clock_t Start,Finish; Start=clock(); fun(); Finish = clock(); double t ...
- C++之编码问题(Unicode,ASCII,本地默认)
本篇文章试图回答的问题: 1.char* pStr="我aa";这句代码执行后,pStr指向的内存区域中存储的字节到底是根据什么码表而来的呢?该字符串占几个字节? 2.将一个VS2 ...
- VMWare虚拟机USB连接问题
错误31:连接到系统上的设备没有发挥作用 原文链接 描述 常用 VMware 虚拟机的有事应该遇到这种情况,就是装完 VMware ,启动时 VMware 下面会有个黄框中有" USB di ...
- poj 3281 Dining【拆点网络流】
Dining Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 11828 Accepted: 5437 Descripti ...
- nyoj 678 最小K个数之和
最小K个数之和 时间限制:1000 ms | 内存限制:65535 KB 难度:2 描述 输入n个整数,输出其中最小的K个数之和.例如输入4,5,1,1,6,2,7,3,3这9个数字,当k=4 ...
- SDWebImage 图片加载和缓存
SDWebImage托管在github上.https://github.com/rs/SDWebImage 这个类库提供一个UIImageView类别以支持加载来自网络的远程图片.具有缓存管理.异步下 ...
- fckeditor的用法
1.下载解压文件 2.将解压后的文件放入webroot下 3.将js引入要使用fckeditor的页面 4.用ckeditor替换textarea <@e.textarea id="t ...
- mysql-no-install 手动安装
D:\mysql-5.5.28-win32 1.下载mysql-5.5.15-win32.zip,解压到本地D:\mysql. 2.将my-small.ini另存为my.ini .(根据情况可以选择别 ...
- zepto下动画返回顶部
function scroll(scrollTo, time) { var scrollFrom = parseInt(document.body.scrollTop) ...
- IOS 中runtime 不可变数组__NSArray0 和__NSArrayI
IOS 中runtime 不可变数组__NSArray0 和__NSArrayI 大家可能都遇到过项目中不可变数组避免数组越界的处理:runtime,然而有时候并不能解决所有的问题,因为类簇不一样 # ...