`

[转]Oracle用一个表的列更新另一个表对应记录的列

阅读更多

随便贴一张网友的妙文:

  今天有这样一个需求:因为要加快查询速度,避免表的联合查询的效率问题,所以要把一个表的几个字段填到另一个表的几个字段上去。 
一开始做法如下: 
update tbl1 a, tbl2 b    set a.col1=b.col1,a.col2=b.col2   where a.key=b.key
   
  这个语句在 MySQL 上是可以运行的,但在 ORACLE 上无法执行。在网上查了一个发现可以这样: 
update tbl1 a
    set a.col1=(select b.col1 from tbl2 b where a.key=b.key),
        a.col2=(select b.col2 from tbl2 b where a.key=b.key)
  但我感觉这样的效率好像比较低,写得SQL又很长,更新一行数据要写两个嵌套,直观上感觉 "select xxx from tbl2 b where a.key=b.key" 语句好像被执行了两遍(实际我没有测试验证)。于是接着在网上搜,查到一个比较好看的写法,如下:

update tbl1 a
   set (a.col1, a.col2) = (select b.col1, b.col2
                              from tbl2 b
                              where a.key = b.key)

这种写法感觉还比较满意。但注意了,经过测试,这种语法在 MySQL 中是不合法的。

今天继续使用最后这个SQL的时候,也发现了一些缺点:如果 tbl1.key 的值在 tbl2.key 中没有此值是,这个更新的两个字段 tbl1.col1 和 tbl1.col2 字段会被更新为空值(null)。这个结果是我不想看到的。也是没办法解决的。如果想解决的话,也可以在最后加入一个条件,如下表中加大字体的部分:

update tbl1 a
   set (a.col1, a.col2) = (select b.col1, b.col2
                              from tbl2 b
                              where a.key = b.key)
   where a.key in(select key from tbl2)

但这种做法肯定会导致性能严重下降。所以,我写一个更复杂的方法来解决这个问题,现在没时间。。。

分享到:
评论

相关推荐

    ORACLE中查找定位表最后DML操作的时间小结

    在Oracle数据库中,如何查找,定位一张表最后一次的DML操作的时间呢? 方式有三种,不过都有一些局限性,下面简单的解析、总结一下。 1:使用ORA_ROWSCN伪列获取表最后的DML时间  ORA_ROWSCN伪列是Oracle 10g开始...

    oracle数据库经典题目

    同义词是数据库对象的一个替代名,在使用同义词时,Oracle会将其翻译为对应的对象名称 B.在创建同义词时,所替代的模式对象必须存在 C.Oracle中的同义词分为公有同义词和私有同义词 D.公有同义词在数据库中所有的...

    oracle实验报告

    1、用PL/SQL实现:输入empno的值,显示emp表中对应记录的内容。 2、用PL/SQL完成:读入三个数,计算并输出它们的平均值及三个数的乘积。 3、对职工表emp中的雇员SCOTT提高奖金,若工种为MANAGER,则奖金提高其原来的...

    oracle学习文档 笔记 全面 深刻 详细 通俗易懂 doc word格式 清晰 连接字符串

    2. oracle11G自带一个卸载批处理\app\Administrator\product\11.2.0\dbhome_1\deinstall\deinstall.bat 3. 运行该批处理程序将自动完成oracle卸载工作,最后手动删除\app文件夹(可能需要重启才能删除) 4. 运行...

    赤兔Oracle数据库恢复软件 v11.6.zip

    31.支持对误删除数据的恢复,即使被删除数据的表中有LOB列,即使被删除数据的表中对应row directory中所有记录的offset都已经完全被Oracle清除 赤兔Oracle数据库恢复软件软件安装   把下载好的安装包解压到...

    00 ORACLE 9i官方教材中文

    能够唯一表示数据表中的每个记录的【字段】或者【字段】的组合就称为主码。 2. 什么是外码(外键) 表1.2的【编号】字段和表1.1的【导师编号】字段是对应的。表1.2中的【编号】字段 1.2的主码。表1.2中的【编号】...

    Oracle最实用函数大全

    SQL中的单记录函数 1.ASCII 返回与指定的字符对应的十进制数; SQL> select ascii(’A’) A,ascii(’a’) a,ascii(’0’) zero,ascii(’ ’) space from dual; A A ZERO SPACE --------- --------- --------- --...

    Oracle DBA实战索引优化

    索引是一种可以选择创建的数据库...ROWID包含了存储列值的表行在磁盘上的物理位置,索引中记录了rowid,因此oracle 就可以根据索引中的rowid来判断记录是否是在同一个block 中,通过下面语句找到记录对应的block号。

    Oracle9i的init.ora参数中文说明

    说明: 指定多个监听程序的地址是分别指定的, 还是用一个 ADDRESS_LIST 字符串指定。如果该值为 TRUE, MTS_LISTENER_ADDRESS 参数可被指定为: (ADDRESS_LIST=(ADDRESS=(PROTOCOL=tcp)(PORT=5000)(HOST=zeus)) ...

    oracle函数大全.doc

    将源字符串 sset从一个语言字符集转换到另一个目的dset字符集 SQL> select convert('strutz','we8hp','f7dec') "conversion" from dual; conver ------ strutz 44.HEXTORAW 将一个十六进制构成的字符串转换为二进制 ...

    SQL语法大全

    Source参数可以是一个Command对象名称、一段SQL命令、一个指定的数据表名称或是一个Stored Procedure。假如省略这个参数,系统则采用Recordset对象的Source属性。 ActiveConnection Recordset对象可以通过...

    2009达内SQL学习笔记

    select:从一个或多个表中检索一个或多个数据列。包含信息:想选择什么表,从什么地方选择。必须要有From子句。(最常用) 当从多张表里查询的时候,会产生笛卡尔积;可用条件过滤它。 当两个表有相同字段时必须加...

    Navicat Premium操作手册.7z

    5SQL Server 分区函数146SQL Server 分区方案147SQL 预览147维护147维护MySQL147维护Oracle148维护PostgreSQL152维护SQLite153维护SQL Server153表查看器155网格查看155使用导览栏155编辑记录156排序、查找或替换...

    数据库系统原理(04735-2018年版)-数据库系统概述笔记.doc

    表中每一列有一 个名称,称为列名、字段名或属性名,每一列表示实体的一个属性,具有相同的数据类 型 属性(Attribute)表中的一列即为一个属性,给每个属性起一个名称即属性名。与之同 义的术语是"列"。表中属性的...

    mysql数据库的基本操作语法

    外键约束是保证一个或两个表之间的参照完整性,外键是构建于一个表的两个字段或是两个表的两个字段之间的参照关系。 也就是说从表的外键值必须在主表中能找到或者为空。 当主表的记录被从表参照时,主表的记录将不...

    MYSQL,SQLSERVER,ORACLE常用的函数

    SQL中的单记录函数 1.ASCII 返回与指定的字符对应的十进制数; SQL> select ascii('A') A,ascii('a') a,ascii('0') zero,ascii(' ') space from dual; A A ZERO SPACE --------- --------- --------- --------- ...

    Oraclet中的触发器

    例1: 建立一个触发器, 当职工表 emp 表被删除一条记录时,把被删除记录写到职工表删除日志表中去。 CREATE TABLE emp_his AS SELECT * FROM EMP WHERE 1=2; CREATE OR REPLACE TRIGGER del_emp BEFORE DELETE ON ...

    空间数据库技术应用:关系数据库的概念.pptx

    二维表的行(记录或元组)对应于一个具体的实体,如一个学生实体。 02 常用的关系数据库 由Microsoft 公司发布的Office系列关系数据库管理系统。专为个人计算机应用小型数据库而开发,可以用来开发如生产管理、销售...

    经典全面的SQL语句大全

     UNION 运算符通过组合其他两个结果表(例如 TABLE1 和 TABLE2)并消去表中任何重复行而派生出一个结果表。当 ALL 随 UNION 一起使用时(即 UNION ALL),不消除重复行。两种情况下,派生表的每一行不是来自 TABLE1...

    Toad 使用快速入门

    例如,当我们点一个数据库的表,所有和此表相关的索引、约束、存储过程、SQL语句以及和其他表的相互引用关系都在同一界面显示出来。为了简化操作,用户可以在浏览窗口操作数据库对象。 SQL 编辑器: SQL 编辑器的...

Global site tag (gtag.js) - Google Analytics