在Oracle数据库中同时更新两张表的简单方法

 更新时间:2015年11月21日 17:43:51   作者:王小明123  
这篇文章主要介绍了在Oracle数据库中同时更新两张表的简单方法,同时介绍了一种差异性合并更新的方法,需要的朋友可以参考下

以前只会写一些简单的updaet语句,比如updae table set c1='XXX' 之类的

今天遇到一个数据订正的问题,项目背景如下,有个表A,有两个字段a1,a2还有一个关联表B,其中也有两个字段,b1和b2。其中a2和b2是关联的,想把A中的字段a1更新成B中的b1

理论上sql应该挺好写的,但是在oralce中实现了半天一直报语法错误。而且确实还有些小小细节没有注意到。

首先上测试数据

表1,ZZ_TEST1

20151121174054751.jpg (422×107)

表2,ZZ_TEST2

20151121174127229.jpg (299×109)

要把表一的text更新成表二的text1值,对应的sql如下:

update ZZ_TEST1 t1 set t1."text" = (
 select T2."text1" from ZZ_TEST2 t2 where T2."pid"=t1."id"
) 
WHERE EXISTS
(
 SELECT 1 FROM ZZ_TEST2 t2 where T2."pid"=t1."id"
)

后面的where条件表示一个限制条件,只更新那些符合条件的数据,也可以写成

update ZZ_TEST1 t1 set t1."text" = (
 select T2."text1" from ZZ_TEST2 t2 where T2."pid"=t1."id"
)
where t1."id" in (select "pid" from ZZ_TEST2 )

另外还有一种merge的写法,对应的sql如下:

merge into ZZ_TEST1 t1 using ZZ_TEST2 t2 on (t1."id" =t2."pid") 
 
when matched then
 
update set t1."text"=t2."text1"

为了避免T2中有多条数据对应T1中的数据,可以把sql改成如下的方式:

MERGE INTO ZZ_TEST1 t1 USING 
( 
SELECT * FROM ZZ_TEST2 X WHERE X. ROWID = 
(SELECT MAX(Y.ROWID) FROM ZZ_TEST2 Y WHERE X."id" = Y."id" )
 ) 
t2 
ON (t1."id" = t2."pid") 
WHEN MATCHED THEN
UPDATE SET t1."text" = t2."text1"

还有一种update from 的语法,经过测试在oracle和mysql中不适用


总结一下,项目中尝尝需要把一张表的字段更新到另一张表中的某一个字段。可以使用update语法,并要做好限定。会使用merge的语法,另外还有一种merge的语法也可以,update from 不能再oracle和mysql中使用。

相关文章

  • Oracle表空间大小如何查看及扩增

    Oracle表空间大小如何查看及扩增

    Oracle数据库中,表空间是存储数据对象的关键结构,管理表空间包括监控其大小并根据需要进行扩展,以确保数据库运行高效,查看表空间大小,可以通过SQL查询或使用Oracle Enterprise Manager,扩展表空间的方法有手动增加数据文件
    2024-10-10
  • Oracle存储过程基本语法介绍

    Oracle存储过程基本语法介绍

    Oracle存储过程基本语法介绍,有需求的朋友可以参考下
    2012-11-11
  • Oracle BULK COLLECT批量取数据解决方法

    Oracle BULK COLLECT批量取数据解决方法

    在oracle使用中为了提高取数据效率,本文将详细介绍Oracle BULK COLLECT批量取数据,需要了解跟多的朋友可以参考下
    2012-11-11
  • Oracle 子程序参数模式,IN,OUT,NOCOPY

    Oracle 子程序参数模式,IN,OUT,NOCOPY

    Oracle 子程序参数模式主要有IN,OUT,NOCOPY,IN和OUT可以组合,OUT和NOCOPY也可以组合使用.
    2009-10-10
  • 在Oracle数据库表中加载多个数据文件的方法详解

    在Oracle数据库表中加载多个数据文件的方法详解

    这篇文章主要给大家介绍了在Oracle数据库表中加载多个数据文件的方法,本文中,我将展示 SQL 加载器 + Unix 脚本实用程序的强大功能,其中 SQL 加载器可以使用自动 shell 脚本加载多个数据文件,需要的朋友可以参考下
    2024-01-01
  • Oracle  call 和 exec的详解及区别

    Oracle call 和 exec的详解及区别

    这篇文章主要介绍了Oracle call 和 exec的详解及区别的相关资料,这里举例说明了它们之间的区别,需要的朋友可以参考下
    2016-11-11
  • Oracle外键不加索引引起死锁示例

    Oracle外键不加索引引起死锁示例

    这篇文章主要介绍了Oracle外键不加索引引起死锁的情况及解决,需要的朋友可以参考下
    2014-05-05
  • oracle net manager 数据传输安全步骤详解

    oracle net manager 数据传输安全步骤详解

    oracle net manager来加密客户端与数据库之间或中间件与 数据库之间的网络传输数据。这篇文章主要介绍了oracle net manager 数据传输安全 ,需要的朋友可以参考下
    2018-09-09
  • 详解Oracle 11g DRCP连接方式的基本原理

    详解Oracle 11g DRCP连接方式的基本原理

    这篇文章主要为大家详细介绍了Oracle 11g DRCP连接方式的基本原理,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-09-09
  • Oracle REGEXP_LIKE模糊查询用法例子

    Oracle REGEXP_LIKE模糊查询用法例子

    Oracle中偶遇正则表达式的使用,简直逆天,在数据统计方面,最长用的就是regexp_like与regexp_replace两个了,下面这篇文章主要给大家介绍了关于Oracle REGEXP_LIKE模糊查询用法例子的相关资料,需要的朋友可以参考下
    2022-11-11

最新评论