SQLServer怎么获得用户最新或前n条订单

本篇内容介绍了“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条订单”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注网站,小编将为大家输出更多高质量的实用文章!