仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1172|回复: 8
打印 上一主题 下一主题

[学习教程] MYSQL网页设计分页存储历程(三)在sqlserver中打造更...

[复制链接]
活着的死人 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-16 22:15:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
有的时候,一些缺失的功能可以通过别的办法来实现,例如,在MySQL4.1以前,你可以通过使用join方法来替代子查询的功能。在MySQL5.0中,大多数关系型数据库所要求的功能已经都具备。有人提出游标欠好,会锁定行,亏得我锁定的是一时表,不是数据表,不影响数据表的写操纵。

上面是14楼的复兴,让我恍然大悟,因而有了明天的改善版,作废了游标的利用,一时表仍是存在的,感谢。

实在你只需分红两次查询便可:
1,仍是用Row_Number查主表分页
2,Row_Number查主表分页innerjoin明细表..用不到游标的.

复制代码代码以下:
--不必游标的分页
--先将分页的主表放在一时表中,然后用一时表和子表团结查询,来猎取子表信息
--既包管了分页的准确性,也包含了子表信息
CREATETABLE#order
(
numberBIGINT,
orderseqnoVARCHAR(36),
)
insertinto#order
SELECT*FROM(SELECTROW_NUMBER()OVER(ORDERBYoi.CreateDateDESC)ASrownumber,oi.OrderSeqNO
FROMOrderInfooiWHEREoi.OrderSeqNOLIKE%2%)ASo
WHEREo.rownumberBETWEEN10AND20

SELECT*FROM#orderINNERJOINOrderDetailodONod.OrderSeqNO=#order.orderseqno

DROPTABLE#order


复制代码代码以下:
--SELECTTOP10oi.OrderSeqNO,oi.GoodsName,ci.CompanyName,od.*
--FROMOrderInfooiINNERJOINCompanyInfociONoi.CompanyID=ci.CompanyID
--LEFTJOINOrderDetailodONoi.OrderSeqNO=od.OrderSeqNO


--利用row_unmber()完成分页
--原本我们想要的了局是10条定单,了局却不是10条定单,而是10条明细
--实际上是针对的子表举行分页了,定单并非要显现的个数,出来的个数是明细的个数
--就是由于主表和子表团结查询的了局,主表纪录和子表纪录是1:N的干系,一个主表纪录有多个明细

--创建会萃索引
--CLUSTEREDINDEXINDEX_OrderInfoONOrderInfo(OrderSeqNo)
--显现查询实行企图
--SETSTATISTICSIOON

select*from
(SELECTROW_NUMBER()OVER(ORDERBYoi.createdateDESC)ASrownumber,oi.orderseqno,od.OrderDetailID
FROMOrderInfooiLEFTJOINOrderDetailodONoi.OrderSeqNO=od.OrderSeqNO
WHEREoi.OrderSeqNOLIKE%2%
)ASo
WHERErownumberBETWEEN10AND20

--不必游标的分页
--先将分页的主表放在一时表中,然后用一时表和子表团结查询,来猎取子表信息
--既包管了分页的准确性,也包含了子表信息
CREATETABLE#order
(
numberBIGINT,
orderseqnoVARCHAR(36),
)
insertinto#order
SELECT*FROM(SELECTROW_NUMBER()OVER(ORDERBYoi.CreateDateDESC)ASrownumber,oi.OrderSeqNO
FROMOrderInfooiWHEREoi.OrderSeqNOLIKE%2%)ASo
WHEREo.rownumberBETWEEN10AND20

SELECT*FROM#orderINNERJOINOrderDetailodONod.OrderSeqNO=#order.orderseqno

DROPTABLE#order
--办理下面的成绩,有以下几种举措
--1、先依据前提查询主表纪录,然后在C#代码中轮回,再次到数据库查询每条主表纪录的明细信息,然后赋值给属性
--2、在数据库的存储过程当中利用游标,也是先查询主表纪录,然后利用游标轮回的过程当中,查询子表信息,然后在C#中
--会合处置
--很明显,后一种削减了数据库的来往开支,一次猎取了想要的数据,团体以为要比第一种好,接待人人一同会商更好的举措

--必要注重的就是ROW_NUMBER()前往的范例是bigint,而不是int
--上面是游标的存储历程


--创建主表一时表
CREATETABLE#temp
(
rownumberbigint,
orderseqnoVARCHAR(36),
goodsnameVARCHAR(50),
companynameVARCHAR(100)
)
--创建子表一时表
CREATETABLE#detail
(
orderseqnoVARCHAR(36),
detailidUNIQUEIDENTIFIER,
unitpriceDECIMAL(12,2),
Qtyint
)
--拔出主表数据到主表一时表

insertinto#temp
SELECT*
--oo.rownumber,oo.OrderSeqNO,oo.GoodsName,oo.CompanyName
FROM
(SELECTROW_NUMBER()OVER(ORDERBYoi.createdateDESC)ASrownumber,
oi.OrderSeqNO,oi.GoodsName,ci.CompanyName
FROMOrderInfooiINNERJOINCompanyInfociONoi.CompanyID=ci.CompanyID
WHEREoi.CreateDate<GETDATE()
)ASoo
WHERErownumberBETWEEN10AND20

--界说游标
DECLARE@temp_cursorCURSOR
--给游标赋值
SET@temp_cursor=CURSORFORSELECT#temp.orderseqno,#temp.goodsnameFROM#temp

--界说游标轮回过程当中所需保留的一时数据
DECLARE@orderseqnoVARCHAR(36),@goodsnamevarchar(50)

--翻开游标
OPEN@temp_cursor

FETCHNEXTFROM@temp_cursorINTO@orderseqno,@goodsname
--轮回游标,查询子表数据,然后拔出子表一时表
WHILE@@FETCH_STATUS=0
BEGIN
INSERTINTO#detail
SELECTod.OrderSeqNO,od.OrderDetailID,od.UnitPrice,od.Qty
FROMOrderDetailod
WHEREod.OrderSeqNO=@orderseqno

FETCHNEXTFROM@temp_cursorINTO@orderseqno,@goodsname
END

--封闭游标
CLOSE@temp_cursor
DEALLOCATE@temp_cursor

SELECT*FROM#temp
SELECT*FROM#detail
--删除一时表
DROPTABLE#temp
DROPTABLE#detail
DBaaS解决方案既可以解决这些问题,又能为客户节约资金。相反作为解决方案提供商,采用DBaaS模式似乎就并不那么有吸引力了,因为与企业内部署软件的解决方案相比,DBaaS意味着更低的利润。
因胸联盟 该用户已被删除
沙发
发表于 2015-1-19 06:17:25 | 只看该作者
很多书籍啊,不过个人认为看书太慢,还不如自己学。多做实际的东西,就会遇到很多问题,网上搜下解决问题。不断重复这个过程,在配合sql的F1功能。
分手快乐 该用户已被删除
板凳
发表于 2015-1-28 05:10:29 | 只看该作者
外键的级联更能扩展可能大部分的同行在设计OLTP系统的时候都不愿意建立外键,都是通过程序来控制父子数据的完整性。
透明 该用户已被删除
地板
发表于 2015-2-5 16:49:19 | 只看该作者
不过话说回来了,绝大多数的性能优化准则与对sqlserver存储的结构理解息息相关
第二个灵魂 该用户已被删除
5#
发表于 2015-2-13 00:52:48 | 只看该作者
SP4包括用于以下SQLServer2000组件的程序包:Database组件(下载文件:SQL2000-KB884525-SP4-x86.EXE)更新SQLServer2000的32位Database组件,包括数据库引擎、复制、客户端连接组件及工具。有关其他信息,请参阅ReadmeSql2k32Sp4.htm。AnalysisServices组件(下载文件:SQL2000.AS-KB884525-SP4-x86.EXE)更新SQLServer2000的32位AnalysisServices。
简单生活 该用户已被删除
6#
发表于 2015-3-3 11:59:34 | 只看该作者
财务软件要用SQL也只是后台的数据库而已,软件都是成品的,当然多学东西肯定是有好处的..
乐观 该用户已被删除
7#
发表于 2015-3-11 11:05:37 | 只看该作者
比如日志传送、比如集群。。。
蒙在股里 该用户已被删除
8#
发表于 2015-3-18 13:53:23 | 只看该作者
另一个是把SQL语句写到服务器端,就是所谓的SP(存储过程);
山那边是海 该用户已被删除
9#
发表于 2015-3-26 02:55:51 | 只看该作者
至于淘汰的问题,只能说在你的项目周期之内,微软应该都不会倒闭。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-5-5 17:45

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表