`

update更新多表总结

阅读更多

总体原则:1)更新的时候一定要加where条件,否则必然引起该字段的所有记录更新

                   2)跨表更新时,set和where时,尽量减少扫描次数,从而提高优化

 

update更新实例:

 

1) 最简单的形式-单表更新

SQL 代码
  1. --经确认customers表中所有customer_id小于1000均为'北京'
  2. --1000以内的均是公司走向全国之前的本城市的老客户:)
  3. update customers
  4. set city_name='北京'
  5. where customer_id<1000

2) 两表(多表)关联update -- set为简单的数据(直接是值),且仅在where字句中的连接

SQL 代码
  1. --这次提取的数据都是VIP,且包括新增的,所以顺便更新客户类别
  2. update customers a -- 使用别名
  3. set customer_type='01' --01 为vip,00为普通
  4. where exists (select 1
  5. from tmp_cust_city b
  6. where b.customer_id=a.customer_id
  7. )

 

3) 两表(多表)关联update -- 被修改值由另一个表运算而来

SQL 代码
  1. update customers a -- 使用别名
  2. set city_name=(select b.city_name from tmp_cust_city b where b.customer_id=a.customer_id)
  3. where exists (select 1
  4. from tmp_cust_city b
  5. where b.customer_id=a.customer_id
  6. )
  7. 优化:单个字段的优化,简化为扫描一遍
    7.1 SQL 代码
    1. update customers a -- 使用别名
    2. set city_name=nvl((select b.city_name from tmp_cust_city b where b.customer_id=a.customer_id),a.city_name)
  8. -- update 超过2个值(字段
  9. update customers a -- 使用别名
  10. set (city_name,customer_type)=(select b.city_name,b.customer_type
  11. from tmp_cust_city b
  12. where b.customer_id=a.customer_id)
  13. where exists (select 1
  14. from tmp_cust_city b
  15. where b.customer_id=a.customer_id
  16. )

3的缺点,就是对表B进行两遍扫描;

 

 

 

4) 特殊情况的优化:

因为B表的纪录只有A表的20-30%的纪录数,且

 

A表使用INDEX的情况

 

 

使用cursor也许会比关联update带来更好的性能:

 

 

 

SQL 代码
  1. set serveroutput on
  2. declare
  3. cursor city_cur is
  4. select customer_id,city_name
  5. from tmp_cust_city
  6. order by customer_id;
  7. begin
  8. for my_cur in city_cur loop
  9. update customers
  10. set city_name=my_cur.city_name
  11. where customer_id=my_cur.customer_id;
  12. /** 此处也可以单条/分批次提交,避免锁表情况 **/
  13. -- if mod(city_cur%rowcount,10000)=0 then
  14. -- dbms_output.put_line('----');
  15. -- commit;
  16. -- end if;
  17. end loop;
  18. end;

5) 关联update的一个特例以及性能再探讨
Oracle
update语句语法中,除了可以update表之外,也可以是视图,所以有以下1个特例:

SQL 代码
  1. update (select a.city_name,b.city_name as new_name
  2. from customers a,
  3. tmp_cust_city b
  4. where b.customer_id=a.customer_id
  5. )
  6. set city_name=new_name


这样能避免对B表或其索引的2次扫描,但前提是 A(customer_id) b(customer_id)必需是unique index或primary key

 

分享到:
评论

相关推荐

    ORACLE多表关联的update语句

    总结,Oracle的多表关联UPDATE语句是一种强大的工具,能够有效处理跨表的数据更新需求,确保数据的一致性和准确性。在实际应用中,应根据业务逻辑和数据关系选择最适合的更新方法,并进行充分的测试以确保其正确性和...

    不同数据库update实现多表更新.doc

    因此,本文总结了在SQL Server、Oracle、MySQL三个数据库系统中update语句更新多表的用法。 一、SQL Server update语句 SQL Server的update语句的基本语法如下: ```sql UPDATE { table_name WITH ( [ ...n ] ) | ...

    Mysql跨表更新 多表update sql语句总结

    本文主要总结了在MySQL中进行多表更新的不同SQL语句写法,适用于需要根据一张表中的数据来更新另一张表的情况。 首先,我们可以使用传统的`UPDATE`语句与两张表的简单联接(JOIN)来实现跨表更新。例如,假设有`...

    SQLServerUpdate多表Join

    ### SQL Server Update 多表 Join 知识点详解 在 SQL Server 中,有时我们需要更新多个表中的数据,尤其是在这些表之间存在某种关联的情况下。本文将详细介绍如何使用 `UPDATE` 语句结合 `JOIN` 来实现对多个表的...

    MyBatisPlus条件构造器带条件更新update使用示例代码

    总结来说,MyBatisPlus的条件构造器使得我们能够方便地构建各种条件的更新语句,大大提高了代码的可读性和可维护性。通过UpdateWrapper类,我们可以根据实体对象的属性或自定义条件来执行更新操作,这在处理大量数据...

    生成UPDATE语句

    本篇文章将详细介绍如何根据指定的表结构来生成更新语句(UPDATE SQL),并特别关注基于主键更新的情况。这在Oracle数据库管理与开发中是一项非常实用的技术,尤其对于那些需要频繁更新数据库记录的应用场景来说更是...

    在PB 中更新由多个表生成的数据窗口

    - **创建函数**:除了直接在“更新”按钮的Clicked事件中编写代码外,还可以创建一个通用函数`f_updatetable()`来处理多表更新。 - **函数参数**:该函数接收5个参数,包括数据窗口对象、两个表名以及这两个表的主键...

    mysql如何实现 如果存在就update更新,不存在再insert插入.zip

    总结来说,`INSERT INTO...ON DUPLICATE KEY UPDATE`是MySQL中一种高效且实用的技巧,能够优雅地处理数据的插入和更新,尤其适用于需要处理并发操作的场景。在实际应用中,应确保正确设置唯一索引,并根据需要调整`...

    多表更新sql

    ### 多表更新SQL知识点详解 在数据库管理与开发中,多表更新SQL是一种非常实用且高效的技术,尤其是在处理多个相互关联的表时。本文将详细介绍如何利用SQL语句实现多表更新操作,并通过示例代码来具体说明其应用...

    update语句的优化-oracle .pdf

    当更新操作涉及到多表关联且逻辑较为复杂时,可以使用PL/SQL的游标(cursor)来进行逐行处理。通过for循环遍历游标中的数据,可以在循环体中执行具体的更新操作。例如: ```sql BEGIN FOR cr IN ( SELECT a....

    使用windows update API 获取补丁更新情况列表

    总结来说,使用Windows Update API获取补丁更新情况列表是一项涉及网络通信、XML解析和异常处理的复杂任务。通过这个过程,开发者可以定制化地管理系统的更新流程,确保系统始终保持最新和安全的状态。

    SqlDataAdapter.Update批量更新.txt

    - **定义与作用**:批量更新是指一次性处理多个记录的更新操作,以减少对数据库的调用次数,从而提高程序执行效率。 - **应用场景**:适用于需要频繁更新大量数据的场景,如数据同步、数据分析等。 ##### 2.2 `...

    AppUpdate,一个 Android 版本更新的库、A Android version update library

    总结,AppUpdate是Android应用进行版本更新管理的强大工具,通过其丰富的功能和开源特性,开发者可以轻松地集成进自己的应用中,提升应用的更新效率和用户体验。同时,参与开源社区的互动,可以进一步优化这个库,使...

    mysql 批量更新及效率对比

    这种方法首先创建一个临时表,然后将要更新的记录插入临时表,然后从临时表中 Update 到目标表,例如: ```sql create temporary table tmp (id int(4) primary key, dr varchar(50)); insert into tmp values (0, ...

    MySQL 从一张表update字段到另外一张表中

    在MySQL数据库中,更新操作是...总结,MySQL的多表更新功能使得在不同表之间同步数据变得简单,但同时也需要谨慎处理,确保数据的准确性和一致性。理解并熟练运用JOIN和子查询可以帮助你更有效地管理数据库中的数据。

    insert,update导出sql语句

    总结来说,INSERT和UPDATE SQL语句是数据库操作的核心,用于添加和修改数据。导出这些语句的目的是为了数据备份、恢复或在不同环境间迁移数据。使用合适的工具或脚本,可以轻松地批量生成这些语句,提高工作效率。而...

    关掉myeclipse下的checking for update自动更新

    本文将详细介绍如何关闭MyEclipse中的“checking for update”自动更新功能。 #### 一、了解MyEclipse的自动更新机制 MyEclipse是一款基于Eclipse平台的增强版IDE,它集成了许多高级特性,如代码编辑、调试、部署...

    Nexus 5 OTA update-binary 和 update-script

    总结来说,Nexus 5的OTA更新涉及到`update-binary`和`update-script`两个核心组件,它们共同协作完成系统更新的过程。理解这些概念对于Android开发者和高级用户来说非常重要,他们可以借此定制自己的系统更新或修复...

Global site tag (gtag.js) - Google Analytics