SQLServer 获得用户最新或前n条订单的几种SQL语句小结
2011-08-27 00:00
706 查看
实现以上要求,我们可以用以下几种方式,但是效率却相差很远。
首先我们在Order表中,创建一个索引:
CREATE UNIQUE INDEX idx_eid_odD_oidD ON Orders(EmployeeID,OrderDate DESC,OrderID DESC)
多个OrderId是为了在OrderData相同的情况下,按订单号倒序,是个辅助属性。
方法1:
如果想获得前n条订单信息,把 = 号改成IN,然后TOP(n)就可以了。
不论是取一条还是多条,即使有索引,数据多的情况下,也是最慢的。
方法2:
方法2只能取一条信息,不能取多条信息。
在取一条的情况下,这个要比方法1快多了,因为用户相比订单信息要少很多。
方法3:
这个应用到了SQL Server 2005或更高版本的一些新特性,这个效率要比方法2还好。
如果想取得多条,只需更改TOP(n)即可。
APPLY详解,参见 https://www.geek-share.com/detail/2525430898.html
方法4:
这个ROW_NUMBER函数也是在SQL Server 2005后新增的,使用这个和方法3查不多,甚至比3更好,但要注意一点是先按EmployeeID分区,然后再排序。
结合以上方法, 建议用方法3。
首先我们在Order表中,创建一个索引:
CREATE UNIQUE INDEX idx_eid_odD_oidD ON Orders(EmployeeID,OrderDate DESC,OrderID DESC)
多个OrderId是为了在OrderData相同的情况下,按订单号倒序,是个辅助属性。
方法1:
SELECT EmployeeID,OrderID FROM Orders AS O1 WHERE OrderID = ( SELECT TOP(1)OrderID FROM Orders AS O2 WHERE O1.EmployeeID = O2.EmployeeID ORDER BY OrderDate DESC ,OrderID DESC )
如果想获得前n条订单信息,把 = 号改成IN,然后TOP(n)就可以了。
不论是取一条还是多条,即使有索引,数据多的情况下,也是最慢的。
方法2:
SELECT O.EmployeeID,O.OrderID FROM ( SELECT EmployeeID,(SELECT TOP(1)OrderID FROM Orders AS O2 WHERE E.EmployeeID = O2.EmployeeID ORDER BY OrderDate DESC,OrderID DESC) AS OrderID FROM Employees AS E ) AS EO INNER JOIN Orders AS O ON EO.OrderID = O.OrderID
方法2只能取一条信息,不能取多条信息。
在取一条的情况下,这个要比方法1快多了,因为用户相比订单信息要少很多。
方法3:
SELECT E.EmployeeID,O.OrderID FROM Employees AS E CROSS APPLY ( SELECT TOP(1)* FROM Orders AS O1 WHERE E.EmployeeID = O1.EmployeeID ORDER BY O1.OrderDate DESC,O1.OrderID DESC ) AS O
这个应用到了SQL Server 2005或更高版本的一些新特性,这个效率要比方法2还好。
如果想取得多条,只需更改TOP(n)即可。
APPLY详解,参见 https://www.geek-share.com/detail/2525430898.html
方法4:
SELECT O1.EmployeeID,O1.OrderID FROM Orders O1 JOIN ( SELECT ROW_NUMBER() OVER(PARTITION BY EmployeeID ORDER BY OrderDate DESC,OrderID DESC) AS RowNumber,* FROM Orders AS OT ) AS O2 ON O1.OrderID = O2.OrderID WHERE O2.RowNumber = 1
这个ROW_NUMBER函数也是在SQL Server 2005后新增的,使用这个和方法3查不多,甚至比3更好,但要注意一点是先按EmployeeID分区,然后再排序。
结合以上方法, 建议用方法3。
相关文章推荐
- SQLServer 获得用户最新或前n条订单的几种SQL语句小结
- SQL Server:获得用户最新或前n条订单的几种SQL语句
- SQL Server:获得用户最新或前n条订单的几种SQL语句
- |- SQLServer 2012 -| 创建用户(非sql语句)和配置远程访问数据库
- sqlserver如何用企业管理器和sql语句两种方式创建用户?
- 【SqlServer】抓取sql语句的几种方法
- 如何从EXPDP导出的文件里获得用户授权的SQL语句
- sqlserver sql语句创建登录,创建用户并授予访问权限
- 查询所有订单的最新信息的SQL语句的写法 DISTINCT配合count和group by一起完成
- oracle中scott用户下四个基本表SQL语句练习
- 获得EntityFramework生成的SQL语句
- 创建数据库、表、主外键、各种约束、存储过程、视图、索引、事务使用、触发器、创建登录账号、数据库用户 Sql语句示例
- Magento 1.5版本,导出order详细订单的SQL语句 、 取消订单事件 同时删除多个ID foreach
- easyui datagrid 禁止选中行 EF的增删改查(转载) C# 获取用户IP地址(转载) MVC EF 执行SQL语句(转载) 在EF中执行SQL语句(转载) EF中使用SQL语句或存储过程 .net MVC使用Session验证用户登录 PowerDesigner 参照完整性约束(转载)
- SqlServer如何通过SQL语句获取处理器(CPU)、内存(Memory)、磁盘(Disk)以及操作系统相关信息
- 查看SQLserver编码格式的SQL语句
- Sqlserver根据表名生成insert 插入语句的sql
- SQL Server 用户管理:用 SQL 语句创建数据库用户(SQL Server 2005)
- SQLSERVER ISNULL 函数与判断值是否为空的sql语句
- oracle,mysql,sqlserver,db2取前十条记录sql语句