我的编程空间,编程开发者的网络收藏夹
学习永远不晚

sql apply查询应用

短信预约 信息系统项目管理师 报名、考试、查分时间动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

sql apply查询应用

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来验证两者的输出。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

sql apply查询应用

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

下载Word文档

猜你喜欢

sql apply查询应用

相关博客:SQL中ROW_NUMBER和APPLY在处理TOP N等类似问题的一点比较SQL Server-聚焦APPLY运算符(二十七)你真的会玩SQL吗?冷落的Top和Apply有以下应用场景当用到了row_number over做分组排序时,可以考虑用a
sql apply查询应用
2015-08-21

SQL LOWER函数在模糊查询中的应用

在SQL中,LOWER函数用于将文本字段的所有字符转换为小写形式。在模糊查询中,我们经常使用通配符来匹配任意字符,但有时我们可能希望忽略大小写进行匹配。这时,我们可以使用LOWER函数来实现这一目的。以下是一个使用LOWER函数进行模糊查
SQL LOWER函数在模糊查询中的应用
2024-10-24

SQL查询优化:LOWER函数的应用实践

在SQL查询优化中,使用LOWER函数可以帮助我们将字段值转换为小写,从而在进行比较操作时不受大小写的影响。这可以提高查询性能,特别是在处理大量数据时。以下是一些关于如何在实践中应用LOWER函数的示例:忽略大小写的字符串比较:当我们需要
SQL查询优化:LOWER函数的应用实践
2024-10-24

常用sql语句查询

oracle常用经典SQL查询常用SQL查询: 1、查看表空间的名称及大小 select t.tablespace_name, round(sum(bytes/(1024*1024)),0) ts_sizefrom dba_tablespaces t, dba

	常用sql语句查询
2019-10-10

sql查询exists怎么用

exists 操作符检查子查询中是否存在记录,返回布尔值 true 或 false。用法:select column_list from table_name where exists (subquery); 优点:效率、易用性和可读性。注
sql查询exists怎么用
2024-05-30

SQL拼接在大数据查询中怎么应用

在大数据查询中,SQL拼接可以用来动态生成查询条件或者连接多个数据源进行联合查询。以下是一些常见的情况和应用:动态生成查询条件:通过拼接SQL语句,可以根据用户输入的条件动态生成查询条件,例如在一个电商网站中,用户可以选择多个筛选条件,然后
SQL拼接在大数据查询中怎么应用
2024-04-29

SQL联表查询

表1学生信息表 表二专业信息表 – join on 连接查询 – where 等值查询 1、内连接 分为两种 等值连接: 查找两个表中连接字段相等的记录。 --查询每个学生的(学生表)学号、姓名、籍贯、年龄、(专业表)专业、班级--涉
2023-08-19
2023-09-01

优化 SQL 查询

在编写查询时,我们应该始终花时间找到编写查询的最佳方式。 有时,这可能意味着使用表面上看起来速度不快但实际上速度很快的方法。 查询优化对于拥有高效的网站至关重要。虽然查询优化也适用于报告和分析,但作为 web 服务一部分运行的查询是网站用户
优化 SQL 查询
2024-10-14

SQL子查询怎么使用

这篇“SQL子查询怎么使用”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“SQL子查询怎么使用”文章吧。SQL子查询或称为内部
2023-06-27

Mybatis动态SQL及单表多表查询怎么应用

本文小编为大家详细介绍“Mybatis动态SQL及单表多表查询怎么应用”,内容详细,步骤清晰,细节处理妥当,希望这篇“Mybatis动态SQL及单表多表查询怎么应用”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。单
2023-07-02

Python: Apply方法的应用

刚才看python学习书籍,发现关于apply方法有如下介绍: 使用元组或字典中的参数调用函数Python允许你实时地创建函数参数列表. 只要把所有的参数放入一个元组中, 然后通过内建的 apply 函数调用函数. 如 Example 1-
2023-01-31

模拟sql查询Golang

有志者,事竟成!如果你在学习Golang,那么本文《模拟sql查询Golang》,就很适合你!文章讲解的知识点主要包括,若是你对本文感兴趣,或者是想搞懂其中某个知识点,就请你继续往下看吧~问题内容我有一个功能:func (db *dbsq
模拟sql查询Golang
2024-04-04

编程热搜

目录