热门标签 | HotTags
当前位置:  开发笔记 > 数据库 > 正文

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

场景:有一张用户表,一个订单表,要求获得一个用户对应的最新的一条订单信息。
实现以上要求,我们可以用以下几种方式,但是效率却相差很远。
首先我们在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.jb51.net/article/28105.htm
方法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。
推荐阅读
  • 本文介绍了 PHP 的基本概念、服务器与客户端的工作原理,以及 PHP 如何与数据库交互。同时,还涵盖了常见的数据库操作和安全性问题。 ... [详细]
  • GreenPlum采纳ShareNothing的架构,良好的施展了便宜PC的作用。自此IO不在是DW(datawarehouse)的瓶颈,相同网络的压力会大很多。然而GreenPlum的查问优化策略可能防止尽量少的网络替换。对于首次接触GreenPlum的人来说,必定耳目一新。 ... [详细]
  • Python Matplotlib 绘制折线图示例
    本文提供了一个详细的 Python 代码示例,展示如何使用 Matplotlib 库绘制折线图,包括设置图像尺寸、背景色、分辨率、标题、坐标轴标签、刻度、图例和注释等。 ... [详细]
  • 本文介绍了如何在 Lisp in a Box 中进行自定义设置,包括快捷键、行号显示和背景主题等。由于直接在 .emacs 文件中设置无效,需要在特定文件中进行配置。 ... [详细]
  • 本文介绍了 jQuery 的基本使用方法,包括文档就绪函数和常用的鼠标事件处理,以及各种选择器的详细说明。 ... [详细]
  • 整理于2020年10月下旬:总结过去,展望未来Itistoughtodayandtomorrowwillbetougher.butthedayaftertomorrowisbeau ... [详细]
  • 文章目录python包-requests关于requests包安装和使用pythonrequests请求超时设置工作中遇到的常见问题整理访问https网站,报错cer ... [详细]
  • 本文介绍了编程语言的基本分类,包括机器语言、汇编语言和高级语言的特点及其优缺点。随后详细讲解了Python解释器的安装与配置方法,并探讨了Python变量的定义、使用及内存管理机制。 ... [详细]
  • 本文通过一个具体的案例,展示了如何使用 Python 爬虫技术从京东网站爬取手机的价格和参数。最近发布的 iPhone X 虽然价格昂贵,但不妨碍我们探索其他高性价比的国产手机。 ... [详细]
  • Hadoop Datanode DataXceiver 错误处理问题
    Ambari 每分钟会向 Datanode 发送一次“ping”请求以确保其正常运行。然而,Datanode 在处理空内容时没有相应的逻辑,导致出现错误。 ... [详细]
  • 使用System.getProperty()获取系统属性
    本文详细介绍了如何使用System.getProperty()方法获取Java运行时环境中的各种系统属性,包括Java版本、操作系统信息等。 ... [详细]
  • 本文整理了 DedeCMS 中常用的标签分类及其具体应用方法,包括标题调用、导航调用、文章列表、子栏目调用、尾部信息调用等。 ... [详细]
  • 深入理解Select、Poll和Epoll
    本文详细介绍了三种常用的I/O多路复用技术:Select、Poll和Epoll。通过对比它们的工作原理和性能特点,帮助读者更好地选择适合的I/O模型。 ... [详细]
  • 阿里云OSS访问权限错误:AccessDenied
    在使用阿里云对象存储服务(OSS)时,遇到AccessDenied错误,提示您无权访问指定对象,原因可能与Bucket的ACL设置有关。 ... [详细]
  • RobotFramework之资源文件资源文件导入资源文件资源文件与用例前置、后置结合使用资源文件资源(Resource):用户关键字的 ... [详细]
author-avatar
炯炯800
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有