好贷网好贷款

----@呵呵:比的就是速度,看不懂的都是经典@---- 100luoyoumou]

发布时间:2016-12-5 18:27:22 编辑:www.fx114.net 分享查询网我要评论
本篇文章主要介绍了"----@呵呵:比的就是速度,看不懂的都是经典@---- 100luoyoumou]",主要涉及到----@呵呵:比的就是速度,看不懂的都是经典@---- 100luoyoumou]方面的内容,对于----@呵呵:比的就是速度,看不懂的都是经典@---- 100luoyoumou]感兴趣的同学可以参考一下。

-------最近小弟写了几个存储过程,望各位有兴趣可测试一下(最好插入大量数据,测试一下速度)------ -------有错之处,还望各位高手加以指正!  小弟在此深表感谢! -------说实话:我都看不懂牛人写的嵌套子查询函数,牛人就是牛人嘛,小弟会努力的..........------- -------在动手的同时:向牛人学习!向速度学习!向小F、小梁、Tony、Josy等牛人学习 -------最近确实跟他们学到了不少知识,在此再谢谢! -------但有一点:大部分人认为游标比SQL语句要慢,那就快快动手吧........,实践是检验真理的唯一标准!------ -------原帖网址: http://topic.csdn.net/u/20091009/09/1f801515-d0c7-4cef-901c-943cfb332baf.html ------------------------------------------------------- -----       进出仓结存----修正版(函数版)   ------------  ----------Author:Luoyoumou---------------------------- ------------------------------------------------------- alter function inout_func(@fromdate datetime, @todate datetime) /* select * from dbo.inout_func( '2009-08-01','2009-08-31' ) select * from dbo.inout_func( '2009-08-01','2009-09-30' ) */ returns     @t table([billid] int,[bd] varchar(10),[bc] varchar(10),[storeid] varchar(4),[goodsid] varchar(5),[qty] int) as begin DECLARE @t2 table ( id int identity(1,1), --自增标识位 billid varchar(4), bd varchar(10), bc varchar(10), storeid varchar(4), goodsid varchar(5),   qty int, sum_out int --指定时间段的出库总数量 ); insert into @t2(billid, bd, bc, storeid, goodsid, qty, sum_out) select i.billid, i.bd, i.bc, i.storeid, i.goodsid, i.qty,        isnull(o.sum_out,0) sum_out   from instored i left join (         select storeid, goodsid, sum(qty) as sum_out           from outstored          where bd >[email protected] and bd<[email protected]           group by storeid, goodsid ) o    on i.storeid=o.storeid and i.goodsid=o.goodsid   where i.bd >[email protected] and i.bd<[email protected] order by i.storeid, i.goodsid, i.bd; --特定仓库,特定货品无出库记录的指定时间段内的入库记录直接插入 insert into @t(billid, bd, bc, storeid, goodsid, qty) select billid, bd, bc, storeid, goodsid, qty from @t2 where sum_out=0; -----------定义变量------------------------- declare @billid varchar(4) declare @bd varchar(10) declare @bc varchar(10) declare @storeid varchar(4), @storeid2 varchar(4)  declare @goodsid varchar(5), @goodsid2 varchar(4) declare @qty int, @in_sumQty int, @sum_out int declare @flag int set @storeid2='' set @goodsid2='' --游标检索 DECLARE @MyData CURSOR  SET @MyData = CURSOR FOR      SELECT billid, bd, bc, storeid, goodsid, qty, sum_out from @t2     where sum_out<>0 order by Id OPEN @MyData FETCH NEXT FROM  @MyData INTO @billid, @bd, @bc, @storeid, @goodsid, @qty, @sum_out WHILE @@FETCH_STATUS = 0  BEGIN     IF(@storeid2<>@storeid or @goodsid2<>@goodsid) --如果仓库编码或物料编码发生变化(没有细分是哪种情况了)     BEGIN         SET @[email protected] --重新初始化仓库编码变量         SET @[email protected] --重新初始化物料编码变量         SET @in_sumQty=0;      --重新初始化进库存总数变量         SET @flag=0;           --重新初始化标志位     END     SET @[email protected][email protected];     IF(@in_sumQty>@sum_out)      BEGIN         IF(@flag=0)         BEGIN  ----表示第一次查找到符合条件的将要拆分的记录行             INSERT INTO @t(billid, bd, bc, storeid, goodsid, qty)              VALUES(@billid, @bd, @bc, @storeid, @goodsid, @[email protected]_out);             SET @flag=1;         END         ELSE  -----表示第二次或以上查找到符合条件的记录行(整条记录行都当作剩余的库存)         BEGIN             INSERT INTO @t(billid, bd, bc, storeid, goodsid, qty)              VALUES(@billid, @bd, @bc, @storeid, @goodsid, @qty);             END     END     FETCH NEXT FROM  @MyData INTO @billid, @bd, @bc, @storeid, @goodsid, @qty, @sum_out END  CLOSE @MyData  DEALLOCATE @MyData  return end ------------------------牛人搞定的:嵌套子查询函数---------------------------------------------------- -->创建表值函数 create function f_fifo(@start varchar(10),@end varchar(10)) returns     @t table([billid] int,[bd] varchar(10),[bc] varchar(9),[storeid] varchar(3),[goodsid] varchar(4),[qty] int) as begin insert @t select    billid,convert(varchar(10),bd,120),bc,storeid,goodsid,   case when iqty>qty then qty else iqty end  as qty from( select    a.billid,a.bd,a.bc,a.storeid,a.goodsid,a.qty as iqty,   (select sum(qty)     from (select             *,            px=(select count(1)                 from instored                 where storeid=i.storeid  and goodsid=i.goodsid  and (bd<i.bd or bd=i.bd and billid<i.billid) and convert(varchar(10),bd,120) between @start and @end)           from instored i where convert(varchar(10),bd,120) between @start and @end)t     where storeid=a.storeid and goodsid=a.goodsid  and px<=a.px   )-isnull(b.qty,0) as qty from   (select             *,            px=(select count(1)                 from instored                 where storeid=i.storeid and goodsid=i.goodsid and (bd<i.bd or bd=i.bd and billid<i.billid) and convert(varchar(10),bd,120) between @start and @end)           from instored i where convert(varchar(10),bd,120) between @start and @end) a left join   (select storeid,goodsid,sum(qty) as qty from [outstored] where convert(varchar(10),bd,120) between @start and @end group by storeid,goodsid) b on    a.storeid=b.storeid and a.goodsid=b.goodsid  ) tt where qty>0 order by    storeid,goodsid   return end go -->查询1 SELECT * FROM dbo.f_fifo('2009-08-01','2009-08-31') /** billid      bd         bc        storeid goodsid qty ----------- ---------- --------- ------- ------- ----------- 9           2009-08-20 090820002 a仓      g001    200 3           2009-08-23 090823001 b仓      g001    600 5           2009-08-23 090823003 b仓      k002    1900 (3 行受影响) **/ -->查询2 SELECT * FROM dbo.f_fifo('2009-08-01','2009-09-30') /** billid      bd         bc        storeid goodsid qty ----------- ---------- --------- ------- ------- ----------- 6           2009-09-26 090926001 a仓      g001    200 3           2009-08-23 090823001 b仓      g001    600 5           2009-08-23 090823003 b仓      k002    900 7           2009-09-27 090927001 b仓      k002    400 -------------------------还有:数据多了,两者的结果并非完全一样------------------------ ------验证数据代码: /* select sum(qty) from (SELECT * FROM dbo.f_fifo('2009-09-01','2009-09-30')) t select (select sum(qty) from Instored where bd<'2009-08-01')-(select sum(qty) from Outstored where bd<'2009-08-01') exec inout_proc '2009-08-01','2009-08-31' exec inout_proc '2009-08-01','2009-09-30' select top 1 * from instored; select (select sum(qty) from Instored where bd>='2009-08-01' and bd<='2009-09-30')-(select sum(qty) from Outstored where bd>='2009-08-01' and bd<='2009-09-30') */ /* select sum(qty) from (select * from dbo.inout_func( '2009-08-01','2009-09-30' )) t select * from dbo.inout_func( '2009-08-01','2009-09-30' ) */

sf

该回复于2010-07-28 11:10:25被版主删除

学习 

引用 3 楼 fredrickhu 的回复:学习 .

顶了先看看,本子才换了个500G硬盘,还没装SQL呢

不错。

该回复于2010-01-19 17:24:31被版主删除

学习···

引用 8 楼 pt1314917 的回复:学习···...

----谢谢楼上各位顶帖,有误的地方还望各位加以指正!

引用 5 楼 netcup 的回复:顶了先看看,本子才换了个500G硬盘,还没装SQL呢 本子才换1T,没装SQL

引用 11 楼 happyflystone 的回复:引用 5 楼 netcup 的回复: 顶了先看看,本子才换了个500G硬盘,还没装SQL呢 本子才换1T,没装SQL 够骚包。。。

引用 12 楼 pt1314917 的回复:引用 11 楼 happyflystone 的回复: 引用 5 楼 netcup 的回复: 顶了先看看,本子才换了个500G硬盘,还没装SQL呢 本子才换1T,没装SQL 够骚包。。。 哈哈

路过

学习

kk

支持

引用 13 楼 happyflystone 的回复:引用 12 楼 pt1314917 的回复:  引用 11 楼 happyflystone 的回复:  引用 5 楼 netcup 的回复:  顶了先看看,本子才换了个500G硬盘,还没装SQL呢  本子才换1T,没装SQL  够骚包。。。  哈哈 哈哈

顶.

支持

0.0

自己再来ding一下!

引用 18 楼 suchalovelyface 的回复:引用 13 楼 happyflystone 的回复: 引用 12 楼 pt1314917 的回复: 引用 11 楼 happyflystone 的回复: 引用 5 楼 netcup 的回复: 顶了先看看,本子才换了个500G硬盘,还没装SQL呢 本子才换1T,没装SQL 够骚包。。。 哈哈 哈哈 呵呵

引用 18 楼 suchalovelyface 的回复:引用 13 楼 happyflystone 的回复: 引用 12 楼 pt1314917 的回复: 引用 11 楼 happyflystone 的回复: 引用 5 楼 netcup 的回复: 顶了先看看,本子才换了个500G硬盘,还没装SQL呢 本子才换1T,没装SQL 够骚包。。。 哈哈 哈哈 ⊙﹏⊙b汗...来学习的...用不上那么NB的东东...

.

新手仰望学习中……

.

.

值得顶一个呢

.

路过

.

顶  试试

.

学习

--怎么又变成:“(苏格兰折耳鸭)”了?

jf

study!Q

学习

学习

楼主好强!!

人齐了,可以结帖了。

看了一下,还可以,第一种用游标的方式,数据量大了,效率要高点,第二种嵌套太多了,只适合查询小数据量的数据,第一种业务要清楚点

没看懂~

正好要用到,先顶帖再学习``

.

游标本来就慢,占CPU占IO,如果一个查询只能用游标完成只能说明表设计不合理

牛B

鸟人

学习

.

.

.

上一篇:mysql的问题 5分,无满意结帖,结帖人tangwei5233]
下一篇:SQL语句性能优化有哪些技巧? 20sclsmile]

相关文章

相关评论