当前位置: 首页 > news >正文

cross apply 和 outer apply 的区别

使用 APPLY

APPLY 运算符的左操作数和右操作数都是表表达式。 这些操作数之间的主要区别是,right_table_source 可以使用表值函数,该函数可从 left_table_source 获取一个列作为函数的参数之一 。 left_table_source 可以包括表值函数,但不能以来自 right_table_source 的列作为参数。

APPLY 运算符通过以下方式工作,以便为 FROM 子句生成表源:

  1. 针对 left_table_source 的每一行计算 right_table_source 以生成行集 。

    right_table_source 中的值取决于 left_table_source 。 right_table_source 可以按以下方式近似表示:TVF(left_table_source.row),其中,TVF 是表值函数。

  2. 通过执行 UNION ALL 操作,将计算 right_table_source 的值时为每行生成的结果集与 left_table_source 组合起来 。

    APPLY 运算符的结果生成的列的列表是来自 left_table_source(与来自 right_table_source 的列的列表相组合)的一组列 。

示例:

以下示例假定数据库中存在以下表和表值函数:

对象名称列名
DepartmentsDeptID、DivisionID、DeptName、DeptMgrID
EmpMgrMgrID、EmpID
EmployeesEmpID、EmpLastName、EmpFirstName、EmpSalary
GetReports(MgrID)EmpID、EmpLastName、EmpSalary

GetReports 表值函数返回直接或间接报告给指定 MgrID 的所有员工的列表。

该示例使用 APPLY 返回所有部门和部门中的所有员工。 如果某个部门没有任何员工,将不返回该部门的任何行。

SELECT DeptID,
    DeptName,
    DeptMgrID,
    EmpID,
    EmpLastName,
    EmpSalary
FROM Departments d
CROSS APPLY dbo.GetReports(d.DeptMgrID);

如果您希望查询为那些没有员工的部门生成行(这将为 EmpIDEmpLastName 和 EmpSalary 列生成 Null 值),请改用 OUTER APPLY

SELECT DeptID,
    DeptName,
    DeptMgrID,
    EmpID,
    EmpLastName,
    EmpSalary
FROM Departments d
OUTER APPLY dbo.GetReports(d.DeptMgrID);

总结: cross apply 是左边表和右边表,显示的是 关联条件都匹配的行 

 而outer apply 是以左边的表为主表,如果关联条件未匹配,仍然会显示行

apply多用于表值函数的时候。

参考:

FROM 子句,以及 JOIN、APPLY 和 PIVOT (T-SQL) - SQL Server | Microsoft Learn


http://www.mrgr.cn/news/36744.html

相关文章:

  • Redis相关知识
  • docker(一)之cgroup详解
  • Excel怎么自动排序?4种方法任君选择
  • 【IOS】申请开发者账号(公司)
  • SLM2304S 600V, 130mA/270mA 高压半桥驱动芯片,隐藏着哪些强大功能?
  • 为什么我安装了open3d但是在调用的时候没有报错但是什么都没有发生呢
  • 详解swoole框架快速入门
  • MyBatis-Plus的使用基础入门案例
  • 3d gaussian splatting公式推导
  • 使用 Llama 3.1 和 Qdrant 构建多语言医疗保健聊天机器人的步骤
  • 智能雷达AI名片小程序源码系统 基于PHP+MySQL组合开发 带完整的安装代码包以及搭建部署教程
  • 设计模式之观察者模式
  • Git提示信息 Pulling is not possible because you have unmerged files.
  • 桌面PDU插座应用于工业自动化场景
  • AOT源码解析4.4 -decoder生成预测mask并计算loss
  • 《Linux从小白到高手》开篇:脱胎换骨之为什么要深度学习Linux?
  • 一七零、GORM值为0或者空字符串的时候不能被更新创建的五种解决办法
  • 【JavaEE初阶】深入解析死锁的产生和避免以及内存不可见问题
  • electron使用npm install出现下载失败的问题
  • bat脚本的命名方式导致一个脚本不能使用的不明原因的怪事