优化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
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
虚拟V2.5.2是根据DL/T645-1997规约、DL/T645-2007规约、上海规约和BNC智能终端规约设计的虚拟软件。 本软件主要的操作说明如下: 1.下拉菜单的电参数包括: 功能类:中继测试,侦听测试,白名单测试,黑名单测试,区间单测试,不识别号 ○1中继测试只针对TCT监控模块虚拟模式; ○2侦听测试可针对监控645的TCT模块,监控载波的TCT模块或者监控串口数据的交互,对接收的数据进行解析(如果是监控载波鼎信报文,选择单/三相显示,可完成侦听记录/侦听报文的显示在“按相位分屏”和“不分屏”之间切换); ○3白名单为选中的号有效; ○4黑名单为选中的号无效; ○5区间单为接收到所填黑名单区间内的号无效; ○6不识别号为对任意号命令均有效。 命令类:设置底度----设置电量的底度。 使能类:前导符FE,编程开关,支持跨相,通道芯片,长帧测试,自设回复,循环回复。 ○1前导符FE----选中响应帧有4个0xFE作为前导符; ○2编程开关----选中才能写设备地址地址有效; ○3支持跨相----只有中继测试时有效,选中则不进行相位比较,返回的相位信息为自身所处相位(目前所处相位是根据号决定,号除以3,余数为0,相位为C相;相余数为1,相位为A相;余数为2,相位为B相); ○4通道芯片----中继测试时无效,不选中时响应的报文带1字节的相位信息; ○5长帧测试----自定义长帧测试的数据标识。 设置长帧命令示当接到这条命令,将数据标识后的数据内容存储起来,最大255个字节,响应报文的数据域只有数据标识; 读取长帧命令示当接到这条命令,按数据标识后设置的长度(1字节,小于之前发送的存储数据长度)回复之前存储的数据内容。 ○6自设回复----自定义响应报文的内容 选中自设回复后,任何命令都将按自定义的报文进行响应。 控制码:1个字节 数据域:使用者自定义数据域内容,可自由选择是否加0x33或数据域翻转处理,最大255个字节。 后续字节:使用者自定义在645响应帧后添加的内容。 ○6循环回复----按规律循环回复特定报文,使用者可自定义起始字节数和终止字节数,范围为0~255。 注意:自设回复和循环回复使能二选一,不能同时有效。 类型:新载波,采集器,开箱监视器,旧载波 2.事件上报功能 注意:使用者自行定义四个输入框内容 命令框:读事件上报的命令 响应框:上报的事件 取消框:取消事件上报状态的命令 结束框:回复事件上报状态已取消 I/O配置:选择为硬件设置,只需点击“事件使能”就置上事件上报状态;不选择为软件设置,点击“事件使能”后接受到特定报文才置上事件上报状态。 3.快捷键 ALT+S:在1200 / 2400 / 4800 / 9600bps之间快速切换串口波特率。 ALT+A:快速切换是否循环回复。 4.可变速率 选中时此为可变速率,支持从1200,2400,4800,9600自动向上变速,变速条件为正确应答使用者规定的次数。 5.命令选择 使用者可自定义哪些命令响应,哪些命令不响应,其中选中的命令会响应。 注意:现在只针对DL/T645-1997的两条读号命令。 6.提示说明 在软件开启时,在操作记录中将对主要的几个菜单选项进行提示,帮助使用者更好地确定软件应用时的条件。 7.645显示 只处理DL/T645协议报文。 8.延时选择 只在645显示被选择时使能。 (1)响应延迟 收到命令帧后响应延迟,范围为0-5000ms。 (2)字节延迟 字节之间停顿时间, 范围为0-5000ms。 (3)首字节后延迟 首字节响应后停顿时间, 范围为0-500ms。 只在首字节响应后,虚拟会延迟延时响应后续字节。 如果选择随机,虚拟将在0至所选时间内随机一个时间后对命令进行各种延迟。 9.鼎信显示 只在侦听测试模式下显示鼎信协议报文,解析报文。 10.鼎信不解析 只在侦听测试模式下显示鼎信协议报文,不解析报文。 11.自定义数据 按测试要求填写一些645数据项内容。 12.组命令帧 弹出命令发送组帧窗口,这是模拟通道芯片下的设备作为主动发起方,命令帧格式必须符合645规约格式。 需要通信的号会列于列中,使用者可以直接用txt文档导入号,或者一个个输入编辑,双击号改变号的选择状态,或者使用右键全部选择/全部取消。 控制码:1个字节 数据域内容: (1)645数据标识 97为2个字节,07为4个字节,填写的内容无需加0x33和翻转处理。 (2)645数据帧格式 完整的645帧,需要号,控制码和数据内容三个部分。 (3)自定义数据格式 数据域内容由使用者自定义
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值