• 相互关联子查询与嵌套子查询经典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
    http://lovewinter.itpub.net/post/493/6435

  • 相关阅读:
    误报的java.sql.SQLException: Parameter number 21 is not an OUT parameter
    mysql bin-log和innodb_log的关系
    线上mysql内存持续增长直至内存溢出被killed分析(已解决)
    mysql服务器io等待高定位与分析
    mysql 5.6到percona 5.6小版本升级
    mysql内存消耗分析
    centos 7安装mysql报错-bash: ./scripts/mysql_install_db: /usr/bin/perl: bad interpreter: No such file or directory
    windows 7文件误删shift+delete后找回
    oschina github使用指南
    couchbase单向同步
  • 原文地址:https://www.cnblogs.com/hhq80/p/618852.html
Copyright © 2020-2023  润新知