码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 浅析 SQL Server 的 CROSS APPLY 和 OUTER APPLY 查询 - 第二部分


    CROSS APPLY 和 OUTER APPLY 示例

    上一篇文章介绍了 APPLY 运算符并介绍了它与常规 JOIN 的区别。在今天的后续文章中,我们将比较 APPLY 与 INNER JOIN 的性能,并学习如何将 APPLY 与表值函数一起使用。

    APPLY 和 INNER JOIN 比较

    回顾一下,在第 1 部分的末尾,我们运行了一个由两部分组成的查询:第一个查询从 Department 表中选择数据,并使用 CROSS APPLY 为 Department 表的每条记录对 Employee 表求值;第二个查询将 Department 表与 Employee 表联接起来以产生相同的结果:

    在 Navicat 中,我们可以点击“解释”按钮来获取有关数据库执行计划的有价值的信息。以下是关于上述查询的执行计划:

    尽管两个查询的执行计划相似且成本相同,但它们的执行计划确实有所不同:

    • APPLY 查询使用计算标量。它是一个运算符,用于通过执行产生计算值的标量计算操作从现有行值计算新值。这些标量计算包括标量值的转换或串联。请注意,计算标量运算符不是一个耗费大量资源的运算符,并且对我们查询的整体增加的成本非常小,能导致最小的开销。
    • JOIN 查询包含附加的聚集索引扫描。当 SQL Server 从上到下读取聚集索引中的行时(例如在非键列中搜索数据时),就会发生这种情况。这是一个比计算标量稍微成本高一些的操作。

    使用 APPLY 运算符联接表值函数和表

    表值函数是用户定义的函数,它返回表类型的数据。表值函数的返回类型是表,因此,你可以像使用表一样使用表值函数。将表值函数与其他表联接是 APPLY 运算符的设计目的。

    让我们创建一个表值函数,它接受一个 DepartmentID 作为其参数并返回属于该部门的所有员工。在 Navicat 中,我们可以通过点击主工具栏上的大函数按钮,然后点击功能工具栏上的新建函数来创建一个函数:

    这是单击“保存”按钮后的 GetAllEmployeesForDepartment 函数:

    看看当我们使用 CROSS OUTER 和 OUTER APPLY 将我们的新函数加入每个部门时会发生什么:

    在每种情况下,查询都会传递来自外部表表达式的每一行的 DepartmentID,并为每一行评估函数,类似于一个相关子查询。CROSS APPLY 仅返回相关数据,而 OUTER APPLY 也会返回非相关数据,这导致缺失列会显示 NULL。

    我们无法用 INNER JOIN/LEFT OUTER JOIN 替换上述查询中的 CROSS/OUTER APPLY。这样做会产生错误“The multi-part identifier "D.DepartmentID" could not be bound.”。这是因为外部(JOINed)查询的执行上下文与函数(或派生表)的执行上下文不同。因而,你不能将外部查询中的值或变量作为参数绑定到函数。因此,此类查询需要 APPLY 运算符。

    总结

    我们对 CROSS APPLY 和 OUTER APPLY 语句的研究到此结束。总而言之,你在查询中必须使用表值函数时,就需要使用 APPLY 运算符,但它也可以用于内联 SELECT 语句。如果你想试用 Navicat 16,可以在这里下载 Navicat 的 14 天全功能免费试用版。

    往期回顾

    Navicat 被投毒了 | 真相来了!

    Navicat 成为信通院数据库创新实验室成员

    Navicat 学术伙伴计划 - 免费教育版申请

    Navicat 技术智库 - 实战演练与各类热门问题解答

    免费试用攻略 | Navciat 16 数据库管理工具

  • 相关阅读:
    04 使用Keil模拟器和Debug (printf) Viewer窗口实现scanf输入,并进行串口收发回环,无需fgetc重定向
    【笔试题】【day7】
    Qt学习26 布局管理综合实例
    【解决方案】成功解决将XGBoost中plot_importance绘图时出现的f0、f1、f2、f3、f4、f5等改为对应特征的字段名
    Twitter图片数据优化的细节
    Vue中的计算属性和方法有什么区别?
    ActiveMQ、RabbitMQ、RocketMQ、Kafka四种消息中间件分析介绍
    关于毕业论文降重技巧大家掌握了多少呢?
    Qt5.12的快捷安装
    docker 安装minio 一脚shell脚本
  • 原文地址:https://blog.csdn.net/weixin_53935287/article/details/125541781
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号