iis服务器助手广告广告
返回顶部
首页 > 资讯 > 数据库 >sql apply查询应用
  • 456
分享到

sql apply查询应用

sqlapply查询应用 2015-08-21 06:08:16 456人浏览 才女
摘要

相关博客: sql中ROW_NUMBER和APPLY在处理TOP N等类似问题的一点比较 SQL Server-聚焦APPLY运算符(二十七) 你真的会玩SQL吗?冷落的Top和Apply 有以下应用场景 当用到了row_num

sql apply查询应用

相关博客:

sql中ROW_NUMBER和APPLY在处理TOP N等类似问题的一点比较

SQL Server-聚焦APPLY运算符(二十七)

你真的会玩SQL吗?冷落的Top和Apply

有以下应用场景

  • 当用到了row_number over做分组排序时,可以考虑用apply...top替换

row_number over语句:

SELECT A.*
  FROM (   SELECT ROW_NUMBER() OVER (PARTITioN BY O.employeeID ORDER BY O.orderdate DESC) AS ROW,
                  E.LastName,
                  E.FirstName,
                  O.*
             FROM Employees E
             JOIN Orders O
               ON E.EmployeeID = O.EmployeeID) A
 WHERE A.ROW <= 2
 ORDER BY A.EmployeeID;

这里是,先按employeeID分组再组内又按orderdate排序。用apply...top替换

SELECT       E.FirstName,
             E.LastName,
             OT.*
  FROM       Employees E
 CROSS APPLY (   SELECT TOP (2) *
                   FROM Orders O
                  WHERE O.EmployeeID = E.EmployeeID
                  ORDER BY O.OrderDate DESC) AS OT
 ORDER BY E.EmployeeID;

可以用 EXCEPT 比较下两个查询语句得差异。如果没有输出,那么说明完全是等价的。

当可以只需要输出一个聚合函数得值时,直接搞。例子如下:

SELECT 
    soh.SalesOrderID
    ,soh.OrderDate
    ,sod.max_unit_price
FROM Sales.SalesOrderHeader AS soh
JOIN
(
    SELECT 
        max_unit_price = MAX(sod.UnitPrice),
        SalesOrderID
    FROM Sales.SalesOrderDetail AS sod
    GROUP BY sod.SalesOrderID
) sod
ON sod.SalesOrderID = soh.SalesOrderID

这里是关联查询了另外一张表 SalesOrderDetail,需要查出对应的UnitPrice得最大值。用apply...聚合函数直接替换。

SELECT 
    soh.SalesOrderID
    ,soh.OrderDate
    ,sod.max_unit_price
FROM Sales.SalesOrderHeader AS soh
CROSS APPLY
(
    SELECT 
        max_unit_price = MAX(sod.UnitPrice)
    FROM Sales.SalesOrderDetail AS sod
    WHERE soh.SalesOrderID = sod.SalesOrderID
) sod

那如果不是呢。

SELECT 
                       DISTINCT    sale.WideGUID AS WideGUID, --业务GUID,
                                   s_room.RoomNo,
                                   s_room.Room AS RoomNum,
                                   s_room.UnitNo,
                                   s_room.FloorNo,
                                   s_room.HxName AS HxName, --户型
                                   s_room.RoomStru AS RoomType, --房间类型
                                   s_room.Unit AS Unit, --单元
                                   s_room.FloorName AS Floor, --楼层·
                                   s_room.No AS No, --号码
                                   s_room.RoomInfo AS RoomInfo, --房间全称
                                   s_room.XxDate AS XxDate, --销许日期
                                   s_room.JFDate AS SjjfDate, --实际交房日期
                                   s_room.ShortRoomInfo AS ShortRoomInfo, --房间简称
                                   s_room.FangPanUser AS FangPanUser, --放盘人
                                   s_room.FangPanTime AS FangPanTime, --放盘时间
                                   RoomControl.Reason AS FangPanReason --放盘批次
             FROM      (   SELECT DISTINCT s.WideGUID,
                                           s.RoomGUID
                             FROM (   SELECT WideGUID,
                                             RoomGUID
                                        FROM s_Order
                                       WHERE OrderTypeEnum = 0
                                      UNION ALL
                                      SELECT WideGUID,
                                             RoomGuid
                                        FROM s_Contract) s ) sale
             LEFT JOIN s_room
               ON s_room.RoomGUID      = sale.RoomGUID
             LEFT JOIN (   SELECT      s_RoomControl.RoomGUID,
                                       Reason
                             FROM      s_RoomControl
                            INNER JOIN (   SELECT RoomGUID,
                                                  MAX(ControlTime) ControlTime
                                             FROM s_RoomControl
                                            WHERE ControlType = 0
                                            GROUP BY RoomGUID) T
                               ON T.RoomGUID    = s_RoomControl.RoomGUID
                              AND T.ControlTime = s_RoomControl.ControlTime) RoomControl
               ON RoomControl.RoomGUID = s_room.RoomGUID

替换为:

SELECT 
                        sale.WideGUID AS WideGUID, --业务GUID,
                        s_room.RoomNo,
                        s_room.Room AS RoomNum,
                        s_room.UnitNo,
                        s_room.FloorNo,
                        s_room.HxName AS HxName, --户型
                        s_room.RoomStru AS RoomType, --房间类型
                        s_room.Unit AS Unit, --单元
                        s_room.FloorName AS Floor, --楼层·
                        s_room.No AS No, --号码
                        s_room.RoomInfo AS RoomInfo, --房间全称
                        s_room.XxDate AS XxDate, --销许日期
                        s_room.JFDate AS SjjfDate, --实际交房日期
                        s_room.ShortRoomInfo AS ShortRoomInfo, --房间简称
                        s_room.FangPanUser AS FangPanUser, --放盘人
                        s_room.FangPanTime AS FangPanTime, --放盘时间
                        RoomControl.Reason AS FangPanReason --放盘批次
             FROM       (   SELECT DISTINCT s.WideGUID,
                                            s.RoomGUID
                              FROM (   SELECT WideGUID,
                                              RoomGUID
                                         FROM s_Order
                                        WHERE OrderTypeEnum = 0
                                       UNION ALL
                                       SELECT WideGUID,
                                              RoomGuid
                                         FROM s_Contract) s ) sale
             LEFT JOIN  s_room
               ON s_room.RoomGUID = sale.RoomGUID
            CROSS APPLY (   SELECT TOP 1 Reason
                              FROM dbo.s_RoomControl
                             WHERE dbo.s_RoomControl.RoomGUID = dbo.s_room.RoomGUID
                               AND ControlType                = 0
                             ORDER BY ControlTime DESC) RoomControl 

为什么会分析apply呢,主要是近期在工作中遇到大数据量情况下的分页查询,以及聚合查询,表的数据量本来就大,再这么一通操作,服务器直接扛不住。通过实践调试,最后发现apply可以解决这个问题,但是网上对这个apply也没过多的讲述,在这里也只是做个总结。最后的建议是,如果在大数据量下有分页查询或是连接大表又需要聚合查询,可以尝试apply得写法。可以用except来验证两者的输出。

您可能感兴趣的文档:

--结束END--

本文标题: sql apply查询应用

本文链接: https://www.lsjlt.com/news/6405.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • SQL Server怎么使用CROSS APPLY与OUTER APPLY实现连接查询
    本篇内容主要讲解“SQL Server怎么使用CROSS APPLY与OUTER APPLY实现连接查询”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就...
    99+
    2024-04-02
  • sql查询之模糊查询
    like 这里可以参照一下菜鸟教程、mysql like一般用于字符串查询%代表半匹配查询 SELECT * FROM studentWHERE `name` = "孙悟空";SELE...
    99+
    2023-09-03
    sql 数据库 mysql
  • SQL数据查询——连接查询
    文章目录 一、等值和非等值连接查询1.等值连接查询2.非等值连接查询 二、自连接与非自连接三、内连接与外连接1.内连接2.外连接使用左外连接还是右外连接?满外连接 四、UNIO&...
    99+
    2023-10-26
    sql 数据库 mysql oracle
  • SQL拼接在大数据查询中怎么应用
    在大数据查询中,SQL拼接可以用来动态生成查询条件或者连接多个数据源进行联合查询。以下是一些常见的情况和应用: 动态生成查询条件...
    99+
    2024-04-29
    SQL
  • MySQL排查慢查询SQL
    根据MySQL自带慢日志功能定位慢SQL 1、查询有关query的相关变量: show global variables like '%quer%';  参数解释: log_queries_not_using_indexes:是否记...
    99+
    2023-09-05
    mysql sql 数据库
  • SQL联表查询
    表1学生信息表 表二专业信息表 – join on 连接查询 – where 等值查询 1、内连接 分为两种 等值连接: 查找两个表中连接字段相等的记录。 --查询每个学生的(学生表)学号、姓名、籍贯、年龄、(专业表)专业、...
    99+
    2023-08-19
    mysql
  • sql多表查询
    多表查询概念:从多张表查询数据 分类:连接查询和子查询。 有两张表A、B 连接查询: 内连接      相当于查询A、B交集数据 例1:select * from emp,dept where emp.dep_id=d...
    99+
    2023-09-01
    sql 数据库 vim mysql java
  • SQL子查询怎么使用
    这篇“SQL子查询怎么使用”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“SQL子查询怎么使用”文章吧。SQL子查询或称为内部...
    99+
    2023-06-27
  • SQL模糊查询的用法
    这篇文章主要介绍“SQL模糊查询的用法”,在日常操作中,相信很多人在SQL模糊查询的用法问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”SQL模糊查询的用法”的疑惑有所帮助!接...
    99+
    2024-04-02
  • Mybatis动态SQL及单表多表查询怎么应用
    本文小编为大家详细介绍“Mybatis动态SQL及单表多表查询怎么应用”,内容详细,步骤清晰,细节处理妥当,希望这篇“Mybatis动态SQL及单表多表查询怎么应用”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。单...
    99+
    2023-07-02
  • 查询表结构sql
    SELECT     表名       = Case When A.colorder=1 Then D.name Else '' End,...
    99+
    2024-04-02
  • 慢查询sql详解
    慢查询sql 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 例如:第一章 Python 机器学习入门之pandas的使用 提示:写完文章后,目录可以自动生成,如何生成可参考右边...
    99+
    2023-09-05
    sql mysql 数据库
  • SQL查询的技巧
    这篇文章主要介绍SQL查询的技巧,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!1、行列转换问题:假设有张学生成绩表(tb)如下:想变成(得到如下结果): 代码:WITH t...
    99+
    2024-04-02
  • 模拟sql查询Golang
    有志者,事竟成!如果你在学习Golang,那么本文《模拟sql查询Golang》,就很适合你!文章讲解的知识点主要包括,若是你对本文感兴趣,或者是想搞懂其中某个知识点,就请你继续往下看吧~问题内容我...
    99+
    2024-04-04
  • SQL基础查询和LINQ集成化查询
    SELECT SELECT 语句用于从表中选取数据,是 SQL 最基本的操作之一。 通过 SELECT 查询的结果被存储在一个结果表中(称为结果集)。 SQL SELECT ...
    99+
    2024-04-02
  • ORACLE SQL 查询练手
    SQL> conn scott/tiger@clonepdb_plugConnected.SQL> desc empName ...
    99+
    2024-04-02
  • Pandas中怎么使用SQL查询
    在Pandas中可以使用pandasql库来执行SQL查询。首先需要安装pandasql库,可以使用以下命令来安装: pip ins...
    99+
    2024-05-11
    Pandas
  • LINQ to SQL查询和SQL命令怎么使用
    这篇文章主要讲解了“LINQ to SQL查询和SQL命令怎么使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“LINQ to SQL查询和SQL命令怎么使用”吧!直接执行LINQ to S...
    99+
    2023-06-17
  • 如何优化SQL查询
    本篇文章给大家分享的是有关如何优化SQL查询,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。我们致力于打造能够较好运行并延续较长一段时间的que...
    99+
    2024-04-02
  • 怎么使用SQL查询Git仓库
    本篇内容主要讲解“怎么使用SQL查询Git仓库”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么使用SQL查询Git仓库”吧!Git 已经成为了代码版本控制的事实标准,但尽管 Git 相当普及,...
    99+
    2023-06-27
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作