优化update-虚拟表

改前:

A1

update gls_voucher t

set t.promptval = (select sum(m.originalval)

from gls_vchitem m

where m.vid = t.vid

and m.dir = 1)

;

B1

update gls_voucher t

set t.promptexplain = (select max(n.explain)

from gls_vchitem n

where n.vid = t.vid

and n.viid =

(select min(m.viid)

from gls_vchitem m

where m.vid = n.vid

and m.explain is not null))

;

改后:

A1‘

update (select n.yr, n.promptval, a.originalval newVal

from gls_voucher n

inner join (select m.vid, sum(m.originalval) originalval

from gls_vchitem m

where m.dir = 1

group by m.vid) a on n.vid = a.vid) t

set t.promptval = t.newVal

;

B1‘

update (select n.yr, n.promptexplain, q.explain newExplain

from gls_voucher n

inner join (select p.vid, max(p.explain) explain

from gls_vchitem p

inner join (select m.vid, min(m.viid) viid

from gls_vchitem m

where m.explain is not null

group by m.vid) a on p.viid = a.viid

group by p.vid) q on n.vid = q.vid) t

set t.promptexplain = t.newExplain

;

--下边这个语句会报错  ORA-01779:
无法修改与非键值保存表对应的列

说明: gls_voucher凭证(vid主键) 与 gls_vchitem凭证项(viid主键) 通过 vid
关联

目的: 更新凭证promptexplain=该凭证下凭证项中的第一条explain不为空的explain值

原因: 通过第二个inner join关联后,oracle不能确定gls_voucher
n和gls_vchitem p是一对一的查询,改成上面B1‘就行了

update (select n.yr, n.promptexplain, p.explain newExplain

from gls_voucher n

inner join (select m.vid, min(m.viid) viid

from gls_vchitem m

where m.explain is not null

group by m.vid) a on n.vid = a.vid

inner join gls_vchitem p on a.viid = p.viid) t

set t.promptexplain = t.newExplain

时间: 2024-10-14 06:34:16

优化update-虚拟表的相关文章

MySQL中select * for update锁表的范围

MySQL中select * for update锁表的问题 由于InnoDB预设是Row-Level Lock,所以只有「明确」的指定主键,MySQL才会执行Row lock (只锁住被选取的资料例) ,否则MySQL将会执行Table Lock (将整个资料表单给锁住). 举个例子: 假设有个表单products ,里面有id跟name二个栏位,id是主键. 例1: (明确指定主键,并且有此笔资料,row lock) SELECT * FROM products WHERE id='3' F

MySql类似Oracle的dual虚拟表

在mysql里也存在和oracle里类似的dual虚拟表:官方声明纯粹是为了满足select ... from...这一习惯问题,mysql会忽略对该表的引用. 你可千万注意了: select * from dual; mysql会出错——1096:没有使用到表:而oracle 会返回列:“du”,其值为“X”——行为和只有一行记录的普通表是一样的! select  express [from dual];  mysql总是作为返回该表达式值的普通select语句执行,返回一行记录的结果集,fr

在数据库开发中何为虚拟表

在数据库中我们建立的表是真实存在的,比如Student表;而在查询一张或多张表时,尤其是在用可视化工具查询出来的用表显示的数据就是虚拟表;因为这个表不是像Student表那样真实存在数据库的,而是因为条件形成的我们看到的类似的表,这个表是没有名字的,但是我们仍然称它为表,而这个表就是虚拟的表了;而且这个虚拟表存在只是临时的,它不像Student表一样是永久性的(相对来说);所以在学习数据库中如果听到虚拟表之类的也就不要再有疑惑了;其实在程序开发中如果听到虚拟,就应该知道它和某种虚拟的东西类似的,

Hive架构层面优化之一分表

场景:某个日志表数据量很大,而且访问该表的作业比较多,造成耗时比较长: 解决方案:将用的比较少/不常用的字段剥离出去: 案例: 日志表trackinfo,每天约有2亿数据量,有5000个作业按天访问,每天的日志数据量有可能会继续添加下去,那么很可能就满足不了要求(每添加10%的数据量作业大概要添加20分钟):如何解决数据的增长呢? 方案: 将邮件营销EDM,网盟Union从trackinfo表中剥离出来,trackinfo表大概能降到1.5亿左右,这样作业的执行时间大概可以减少40-50分钟时间

Oracle\MS SQL Server Update多表关联更新

原文:Oracle\MS SQL Server Update多表关联更新 一条Update更新语句是不能更新多张表的,除非使用触发器隐含更新.而表的更新操作中,在很多情况下需要在表达式中引用要更新的表以外的数据.我们先来讨论根据其他表数据更新你要更新的表   一.MS    SQL    Server   多表关联更新      sql server提供了update的from 子句,可以将要更新的表与其它的数据源连接起来.虽然只能对一个表进行更新,但是通过将要更新的表与其它的数据源连接起来,就

关于创建虚拟表的小心得

DataTable dt = new DataTable("MyTable"); DataRow dw = dt.NewRow(); DataColumn dc = new DataColumn(); dc.ColumnName = "make"; dt.Columns.Add(dc); dw["make"] = "jodan"; dt.Rows.Add(dw); foreach (DataRow row in dt.Rows

oracle for update锁表资源释放之kill -9和alter system kill session 'sid,serial#';

通过for update锁表,通过操作系统方式和oracle方式终止进程方式 --查询需要终止进程的情况,包括操作系统进程 select proc.sPID, sess.sid, sess.serial#, lo.oracle_username, lo.os_user_name, ao.object_name, lo.locked_mode from v$locked_object lo, dba_objects ao, v$session sess,v$process proc where a

单表查询、多表查询、虚拟表连接查询

  单表查询,以下面这个表为例:+----+------------+--------+-----+------------+----------------------------+--------------+------------+--------+-----------+| id | name | sex | age | hire_date | post | post_comment | salary | office | depart_id |+----+------------+-

MySQL优化分库分表,为什么要分表,分表以后如何进行排序查询,业务如何设计?

MySQL优化分库分表,为什么要分表,分表以后如何进行排序查询,业务如何设计? 昨天面试新人的时候,遇到了这么一个问题,按照自己的想法大体聊了一些,但大多是感性的,并没有完整的了解why and how. 今天查了一些相关的资料,包括<MySQL性能调优与架构设计>.<高性能Mysql>,慢慢的整体理解,请大家指正. 之一,为什么要分表? 分表,按形式,有水平分表和主附分表.水平分表常见于按ID取模或者按日期将相同表结构的内容散列到不同的表上,主附分表常见于有对应关系的多张表,通过

【知识库】-数据库_MySQL之高级数据查询:去重复、组合查询、连接查询、虚拟表

简书作者:seay 文章出处: 关系数据库SQL之高级数据查询:去重复.组合查询.连接查询.虚拟表 回顾:[知识库]-数据库_MySQL之基本数据查询:子查询.分组查询.模糊查询 Learn [已经过测试校验] 一.去重复(DISTINCT) 二.组合查询 三.UNION(并集) 四.连接查询 五.虚拟表 一.去重复(DISTINCT) DISTINCT:用于返回唯一不同的值,主要是用于某一字段 语法 SELECT DISTINCT <列名>|* FROM <表名> 示例 -- 查