Re: [SQL ] SQL条件相加指令

楼主: kevindump (爱看海的呆子)   2015-02-13 10:49:00
您好,基于数据库正规化的概念,
我个人不是很建议这样设计数据库,
因为这样每次更新value,
都要将‘之后每一天’的result做即时更新,
想一想,如果更新去年的资料,那就要重算之后的365笔资料,
万一改了更新到一半,又有资料被改了,可能就会造成lock,
这样设计的好处是读的时候比即时运算快一些,
但是现在的软硬件环境应该可以忽略掉即时sum跟取定值的计算时间差,
我个人是这样建议,如果时间笔数不多,即时sum起来就好,
如果笔数非常非常多,建议是另外做一个专门快取的table比较干净,再定时去更新他,
又,因为笔数非常非常多,所以每次更新可能都要花上一段时间去计算更新,
建议定时更新就好,不要放到trigger里面,这样比较不会影响效能~
※ 引述《sonesnsdsosi (FOREVERSONE)》之铭言:
: 你好,我有想到用procedure 的方法
: 首先 我在你的表格建立PK id 方便后续操作
: 语法如下:
: create or replace procedure pro01
: is
: i number;
: j number;
: begin
: select max(id) into i from yourtable;
: select min(id) into j from yourtable;
: LOOP
: exit when i<j;
: update yourtable set results=(select sum(value) from
: yourtable where id<i) where id=i;
: i:=i-1;
: END LOOP;
: 建立procedure后 每当你有更新value
: 就执行
: execute pro01;
: 就会帮你更新
: 但如果你想要完全自动更新,可能就要搭配trigger+procedure了(有尝试这样做,
: 但一直失败)
: 小弟浅见
: end;※ 引述《lunenknight (BlackMilk)》之铭言:
: : 内容/问题描述:SQL语法问题
: : 假设我有一个资料表如下
: : Date Value "Results"
: : 05/01/01 300 300
: : 05/01/02 200 500
: : 05/01/03 -100 400
: : 05/01/04 -200 200
: : 05/01/05 500 700
: : . . .
: : . . .
: : . . .
: : 我要如何取results值 永远是自己日期以前的value相加
: : 因为需要可以从中间直接更新value值 例如: 将05/01/03 的value更新为 -200
: : 之后的results值 要依序更新为 300 100 600
: : 请问要如何下手...
作者: sonesnsdsosi (FOREVERSONE)   2015-02-13 11:24:00
是阿没有错,会写这个只是根据那位先生的需求而写的因为这样会违反正规化,之后维护也会变得很麻烦就会导致您说的那些问题:)因此还是建议 另外开一张表 来定期更新 或是建立view 透过计算公式来产生results总和只是缺点就是要花多些维护的成本在view上谢谢K大分享经验~
楼主: kevindump (爱看海的呆子)   2015-02-13 15:59:00
不用客气,大家互相求进步嘛~本来作法就会有很多种,各有优缺点,大家交流经验嘛~view其实相当于即时运算,只是db有优化过,会快一些!但是这个case看来量不大,建议参考下篇直接算就好了~

Links booklink

Contact Us: admin [ a t ] ucptt.com