• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • MsSql
  • Mysql
  • oracle
  • MariaDB
  • DB2
  • SQLite
  • PostgreSQL
  • MongoDB
  • Redis
  • Access
  • 数据库其它
  • sybase
  • HBase
您的位置:首页 > 数据库 >Mysql > SQLServer 获得用户最新或前n条订单的几种SQL语句小结

SQLServer 获得用户最新或前n条订单的几种SQL语句小结

作者:匿名 字体:[增加 减小] 来源:互联网 时间:2018-12-05

匿名通过本文主要向大家介绍了前n条订单等相关知识,希望本文的分享对您有所帮助

场景:有一张用户表,一个订单表,要求获得一个用户对应的最新的一条订单信息。

实现以上要求,我们可以用以下几种方式,但是效率却相差很远。
首先我们在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详解,参见
方法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。
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

相关文章

  • 2018-12-05关于Mysql事务性
  • 2018-12-05mysql初次不能登录解决方法
  • 2017-05-11MySQL 数据库跨操作系统的最快迁移方法
  • 2017-05-11mysql压力测试脚本实例
  • 2018-12-05MySQL学习笔记2:数据库的基本操作(创建删除查看)
  • 2017-05-11探讨Mysql中OPTIMIZE TABLE的作用详解
  • 2018-12-05Mysql中四种插入方法的效率对比
  • 2017-05-11MySQL数据库如何开启远程连接(多备份)
  • 2018-12-05sqlserver 无法验证产品密匙的完美解决方案[测试通过]
  • 2018-12-05Mysql varchar大小长度问题介绍

文章分类

  • MsSql
  • Mysql
  • oracle
  • MariaDB
  • DB2
  • SQLite
  • PostgreSQL
  • MongoDB
  • Redis
  • Access
  • 数据库其它
  • sybase
  • HBase

最近更新的内容

    • SQLServer Execpt和not in 性能区别
    • sqlserver数据库主键的生成方式小结(sqlserver,mysql)
    • SQL2005 存储过程解密方法
    • 如何使用PDO查询mysql避免SQL注入的方法
    • nosql篇mongodb初识与安装整理以及与关系型数据库对比
    • mysql Myisamchk小工具使用手册第1/2页
    • Sql 语句学习指南第1/2页
    • SQL 语句优化方法30例
    • asp.net 将图片上传到mysql数据库的方法
    • MySQL字符串截取 和 截取字符进行查询

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有