本篇内容介绍了“SQLServer怎么获得用户新或前n条订单”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!
创新互联专注于青冈网站建设服务及定制,我们拥有丰富的企业做网站经验。 热诚为您提供青冈营销型网站建设,青冈网站制作、青冈网页设计、青冈网站官网定制、小程序定制开发服务,打造青冈网络公司原创品牌,更为您提供青冈网站排名全网营销落地服务。首先我们在Order表中,创建一个索引:
CREATEUNIQUEINDEXidx_eid_odD_oidDONOrders(EmployeeID,OrderDateDESC,OrderIDDESC)
多个OrderId是为了在OrderData相同的情况下,按订单号倒序,是个辅助属性。
方法1:
SELECTEmployeeID,OrderIDFROMOrdersASO1WHEREOrderID=(SELECTTOP(1)OrderIDFROMOrdersASO2WHEREO1.EmployeeID=O2.EmployeeIDORDERBYOrderDateDESC,OrderIDDESC)
假如想获得前n条订单信息,把=号改成IN,然后TOP(n)就可以了。
不论是取一条还是多条,即使有索引,数据多的情况下,也是最慢的。
方法2:
SELECTO.EmployeeID,O.OrderIDFROM(SELECTEmployeeID,(SELECTTOP(1)OrderIDFROMOrdersASO2WHEREE.EmployeeID=O2.EmployeeIDORDERBYOrderDateDESC,OrderIDDESC)ASOrderIDFROMEmployeesASE)ASEOINNERJOINOrdersASOONEO.OrderID=O.OrderID
方法2只能取一条信息,不能取多条信息。
在取一条的情况下,这个要比方法1快多了,因为用户相比订单信息要少很多。
SQLServer获得用户新或前n条订单的SQL语句有哪些
方法3:
SELECTE.EmployeeID,O.OrderIDFROMEmployeesASECROSSAPPLY(SELECTTOP(1)*FROMOrdersASO1WHEREE.EmployeeID=O1.EmployeeIDORDERBYO1.OrderDateDESC,O1.OrderIDDESC)ASO
这个应用到了SQLServer2005或更高版本的一些新特性,这个效率要比方法2还好。
假如想取得多条,只需更改TOP(n)即可。
方法4:
SELECTO1.EmployeeID,O1.OrderIDFROMOrdersO1JOIN(SELECTROW_NUMBER()OVER(PARTITIONBYEmployeeIDORDERBYOrderDateDESC,OrderIDDESC)ASRowNumber,*FROMOrdersASOT)ASO2ONO1.OrderID=O2.OrderIDWHEREO2.RowNumber=1
这个ROW_NUMBER函数也是在SQLServer2005后新增的,使用这个和方法3查不多,甚至比3更好,但要注意一点是先按EmployeeID分区,然后再排序。
结合以上方法,建议用方法3。
“SQLServer怎么获得用户新或前n条订单”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注创新互联网站,小编将为大家输出更多高质量的实用文章!