关联子查询与嵌套子查询

相互关联子查询与嵌套子查询经典SQL语句 Posted on 2007-01-12 15:01 hhq80 阅读(277) 评论(1) 编辑 收藏 所属分类: SQL数据库技术 为每一行数据执行一次并返回它的记录。然后,外部查询根据返回的记录做出决策。 下面我们使用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 语句就可以查询出期望的结果。这使我想到了一位开发经理反复跟我说的一句话:“第一个版本是使其能够运行,第二个版本是使其能够更快地运行。” 嵌套子查询例子: select nbbm,(select ypm+gg from zy_sys2_ypzdk where zy_sys2_ypzdk.nbbm=zy_yp1_sfmx.nbbm) as pm,bzsl from zy_yp1_sfmx 查询客户最新的五个订单(扩展),这个也非常经典 SELECT o1.CustomerID, o1.OrderID, o1.OrderDate FROM Orders o1 WHERE o1.OrderDate IN( SELECT TOP 5 o2.OrderDate FROM Orders o2 WHERE o2.CustomerID = o1.CustomerID) ORDER BY CustomerID

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值