昨天,有一位美女提出了如下需求,週末沒事,在家裡好好查了一下。
1 需求分析
有三張表,商品表(tblitem),庫存表(tblstorage),庫存管理表(tblmanagement);
每一種商品對應的處理區分是0,並且庫存總量大於1000,就把庫存管理表的庫存區分更新為1,小於1000,更新為0。
2 資料準備
drop table tblitem;
drop table tblstorage;
drop table tblmanagement;
create table tblitem as select d.owner as itemno,round(dbms_random.value) as handle_*** from dba_objects d where d.owner<>'sys';
create table tblstorage as select d.owner as itemno,trunc(dbms_random.value(0,100)) as stror_amount from dba_objects d where d.owner<>'sys' ;
create table tblmanagement as select d.owner as itemno,round(dbms_random.value) as store_kind from dba_objects d where d.owner<>'sys' ;
3 sql改善
3.1 寫法一
這種寫法能夠實現需求,但是作為資深的老牌強迫症患者,一條sql語句中重複掃瞄一張表是不能忍受的,所以有了下面異想天開的寫法。
3.2寫法二(錯誤)
with tmp as
(select s.itemno, (case when sum(s.stror_amount)>1000 then 1
else 0 end) as amout***
from tblitem i
inner join tblstorage s
on i.itemno=s.itemno
where i.handle_***=0
group by s.itemno)
update tblmanagement m
set m.store_kind=(select t.amout***
from tmp t
where t.itemno=m.itemno)
where exists(select 1
from tmp t
where t.itemno=m.itemno);
這條語句直接有語法錯誤,如果是檢索處理,用with提取公共部分,還可以,但是是更新操作,無法實現。
3.3 merge優化
用merge改寫,避免了表的重複的掃瞄,物理讀有181k降低到75多。io減少一半。
oracle關聯表更新
如果有a表和b表,sql server中用 update a set field2 b.filed2 from a,b where a.field1 b.field1搞定,所以用慣了sql server的更新表語句,再用oracle的那真是特別的拗口。情景一 如果只是更新固定值,oracle和sql...
兩個超大表做關聯更新的優化 之 批量更新
兩個超大表做關聯更新的優化 2010 12 17 13 43 01 分類 oracle 今天同事給了兩個sql,超級大,乙個表8000多萬,乙個表7800萬,原語句如下 more update channel chengdu.o user cons partition p201011 a set u...
Oracle的關聯表更新(二)
oracle資料庫中有乙個表formtable main 159 dt1結構如下 mainid,id 161,100,161,101,161,102,162,103 162,104 163,105 現在增加乙個字段序號,實現如下的效果 mainid,id,xuhao 161,100,1 161,10...