本篇內容介紹了“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條訂單”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。