马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
解决方案提供商开始推动DBaaS浪潮之前,他们应该深入了解究竟什么是DBaaS。在我的利用SQLServer2005的新函数机关分页存储过程当中,我提到了利用ROW_NUMBER()函数来取代top完成分页存储历程。
可是工夫长了,又发明了新成绩,就是奴才表的分页查询。比方:定单表和定单明细表,请求是查询定单,第二页,每页10条
复制代码代码以下:
--利用row_unmber()完成分页
--原本我们想要的了局是10条定单,了局却不是10条定单,而是10条明细
--实际上是针对的子表举行分页了,定单并非要显现的个数,出来的个数是明细的个数
--就是由于主表和子表团结查询的了局,主表纪录和子表纪录是1:N的干系,一个主表纪录有多个明细
select*from
(SELECTROW_NUMBER()OVER(ORDERBYoi.createdateDESC)ASrownumber,oi.orderseqno,od.OrderDetailID
FROMOrderInfooiLEFTJOINOrderDetailodONoi.OrderSeqNO=od.OrderSeqNO
WHEREoi.OrderSeqNOLIKE"%2%"
)ASo
WHERErownumberBETWEEN10AND20
了局以下图
很分明不是10条定单,而是10条明细。
上面是对查询的一点改善,利用了游标
复制代码代码以下:
--办理下面的成绩,有以下几种举措
--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
SELECToo.rownumber,oo.OrderSeqNO,oo.GoodsName,oo.CompanyNameFROM
(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
了局以下图,即刻看到效果就变了,接待人人一同会商更好的,更精准的分页查询。
下面的T-SQL只在SQLServer2005上调试乐成。
保举一篇MSSQLServer的查询企图的相干内容,能够使用它优化SQL,写的不错。援用:SqlServer实行企图及Sql查询优化初探
正如前文所提到的,MySQL易学、易部署、易管理和易维护。 |