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

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

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中用一张表的字段更新另一张表的字段的更多相关文章

  1. Oracle-更新字段-一张表的字段更新另一张的表的字段

    设备表ops_device_info中的终端号terminal_id值是以 'D'开头的字符串,而终端表ops__terminal_info中的终端号terminal_id是8位字符串, 它们之间是通 ...

  2. MySQL使用一张表的字段更新另一张表的字段

    转自https://blog.csdn.net/anxpp/article/details/73173274 update table1 t1 left join table2 t2 on t1.ke ...

  3. [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 ...

  4. sqlserver 将一个表中的某些字段更新到另一个表中(转载)

    来源:https://blog.csdn.net/qq_23888451/article/details/86615555 https://blog.csdn.net/cyxinda/article/ ...

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

    update table2 b,(select b.area_id as arid,sum(a.user_amount) as bcount from table1 a,table2 b where ...

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

    Oracle两张表关联批量更新其中一张表的数据 方法一(推荐): UPDATE 表2 SET 表2.C = (SELECT B FROM 表1 WHERE 表1.A = 表2.A) WHERE EXI ...

  7. oracle 用一个表的一个字段更新另一个表的一个字段

    案列: 想更新A表的name字段,由于失误,在写这个表的时候,这个字段没有写,发现的时候,已经写了一个多月的数据了.改了之后的过程,会正常的写这个字段, 可是已经写了的数据也不能铲了,重新计算. 好在 ...

  8. oracle 批量更新之将一个表的数据批量更新至另一个表

      oracle 批量更新之将一个表的数据批量更新至另一个表 CreationTime--2018年7月3日17点38分 Author:Marydon Oracle 将一个表的指定字段的值更新至另一个 ...

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

    Oracle 中用一个表的数据更新另一个表的数据 分类: SQL/PLSQL2012-05-04 15:49 4153人阅读 评论(1) 收藏 举报 oraclemergesubqueryinsert ...

随机推荐

  1. plsql的参数IN和OUT

    代码片段一 create or replace procedure scott.pro_para_inout(p_dname in out scott.dept.dname%TYPE, p_loc o ...

  2. andriod and linux kernel启动流程

    虽然这里的Arm Linux kernel前面加上了Android,但实际上还是和普遍Arm linux kernel启动的过程一样的,这里只是结合一下Android的Makefile,讲一下boot ...

  3. POJ2429 - GCD & LCM Inverse(Miller–Rabin+Pollard's rho)

    题目大意 给定两个数a,b的GCD和LCM,要求你求出a+b最小的a,b 题解 GCD(a,b)=G GCD(a/G,b/G)=1 LCM(a/G,b/G)=a/G*b/G=a*b/G^2=L/G 这 ...

  4. unexpected error ConnectionError object has no attribute

    unexpected error ConnectionError object has no attribute

  5. Shell的那些事儿

    日常工作中,哪种语言对你的帮助最大?我觉得非Shell莫属.最早接触Shell应该是在大学的时候,如做Linux文件系统裁减会用到一些命令,如find, tar, xargs, cp等等,并把它们通过 ...

  6. UILabel文本垂直顶部对齐的方法

    也不知道为什么UILabel本身没有提供文本垂直顶部对齐的方法,真的有点晕.我们创建一个简单的UILabel来看看: [box type="info"] UILabel *myLa ...

  7. (贪心5.1.2)POJ 2287 Tian Ji -- The Horse Racing

    /* * POJ_2287.cpp * * Created on: 2013年10月9日 * Author: Administrator */ #include <iostream> #i ...

  8. http://www.cnblogs.com/xdp-gacl/p/3622275.html

    http://www.cnblogs.com/xdp-gacl/p/3622275.html

  9. pycharm的使用技巧

    本文将持续更新一些关于在使用pycharm的过程中的小技巧: 多行缩进/取消缩进 选中需要更改的代码,按 shift + tab 多行注释/取消注释 选中需要更改的代码,按 ctrl  +  / 滚轮 ...

  10. linux ssh 中在window 传文件 下载文件 工具

    centos 安装工具 yum install lrzsz