学习无忧
开发频道 首页 | 入门 | 硬件 | 软件 | 设计 | 开发 | 网络 | 营销 | 社区 | 加油站
首页=>开发=>SQL Server=>选择每位客户最新的订单  
选择每位客户最新的订单
www.51study.net  2004-11-10 23:31
【字体:  】【评论打印】 【关闭
  选择每位客户的所有订单非常简单;事实上任何 SQL 新手都可以在几分钟内构造出这个查询。然而,当你想在干草堆中找出一根针时,就需要一点窍门了。下面我将向你展示如何选择每位客户最新的订单,稍微改变一点语法还可以选择每位客户最老的订单。
  
  这里最大的问题是相互关联子查询(correlated subqueries),相互关联子查询与嵌套子查询有很明显的区别。在嵌套子查询中,内部查询只执行一次并返回它的值给外部查询,然后外部查询在它的处理中使用内部查询返回给它的值。而在相互关联子查询中,对于外部查询返回的每一行数据,内部查询都要执行一次。另外,在相互关联子查询中是信息流是双向的。外部查询的每行数据传递一个值给子查询,然后子查询为每一行数据执行一次并返回它的记录。然后,外部查询根据返回的记录做出决策。
  
  下面我们使用Northwind 数据库作为一个例子。我们需要列出由每位客户下达的最新的订单。
  
  SELECT o1.CustomerID, o1.OrderID, o1.OrderDate
  FROM Orders o1
  WHERE o1.OrderDate =
  (SELECT Max(OrderDate)
  FROM Orders o2
  WHERE o2.CustomerID = o1.CustomerID)
  
  对于外部查询返回的每行数据,内部查询都会执行,条件是限制其结果集与CustomerID匹配。Max() 调用将结果集限制为感兴趣的一行数据。
  
  如果有500位客户下达了订单,内部查询将执行500次——每个CustomerID执行一次。现在我们已经有了答案:返回90行数据,也就是说这90条数据中每条数据都代表一位客户下达了一个订单。
  
  你可以很容易地对这个查询进行扩展。例如,你可能想查询每个客户所下订单的最新两个订单。在这种情况下,需要将内部查询改为以下这种形式:
  
  SELECT o1.CustomerID, o1.OrderID, o1.OrderDate
  FROM Orders o1
  WHERE o1.OrderDate IN(
  SELECT TOP 2 o2.OrderDate
  FROM Orders o2
  WHERE o2.CustomerID = o1.CustomerID)
  ORDER BY CustomerID
  
  你可以以不同方式优化这个例子,以避免开销很大的 IN() 谓词。
  
  以我的经验来看,很多开发人员在学习完相互关联子查询之后很快就会忘记其概念。这真的很让人感到遗憾,因为相互关联子查询可以很简单很优雅地回答难度很大的问题。
  
  我的意见是这个语法可行,并且用一个 SQL 语句就可以查询出期望的结果。这使我想到了一位开发经理反复跟我说的一句话:“第一个版本是使其能够运行,第二个版本是使其能够更快地运行。”
【字体:  】【评论打印】 【关闭
发表评论 共有0条评论   >> 查看详细评论
用户名: 密 码: 匿名评论
请发表评论时遵纪守法并注意语言文明!
 
用户名 评论内容
目前尚无评论!
 
文章搜索
关键字:
精彩文章回顾
 SQL Server 2
 ASP、JSP、PHP
 利用ASP技术开发基于W
 WORD和ACCESS的
 Access 数据库表规
 SQL Server的性
 SQL 非正常删除日志文
 拷贝的SQL Serve
广而告之
关于我们 | 广告服务 | 诚邀加盟 | 友情链接 | 网站地图 | 联系方式
Copyright ©1998-2005, All Rights Reserved.
版权所有 学习无忧网 51study.net
广告或空间合作,请QQ:70046085联系我