|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
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意味着更低的利润。 |
|