标签
SQL Server
Redis
MySQL
Git
办公软件
开发工具
浏览器
工具箱
WPF
winfrom
windows
设计模式
框架
C# 基础
Web服务器
Gitee
Github
HTML
面试题
笔试题
解决方法
SVN
术语和定义
计算机基础知识
DeepSeek
SQL Server / SSMS
Visual Studio
VS Code
nginx
C# 面试题
微信
编码
网络协议
PS
其它
Linux
Mybatis
正则表达式
CPU
大数据
物联网
异常错误
SSH
ADO.NET
ASP.NET
正则表达式
Hyper
Unix
实现方案
Python 基础
Json
时间规范
Linq
Web Forms
MCP
Oracle
算法
COZE
包管理工具
vite
gitblit
Monorepo
VMware
待学习
Ollama
WorkBuddy
.NET
Spring
SpringBoot
SpringCloud
分布式
.NET Core 中间件
IntelliJ IDEA
Maven
DataGrip
.NET 类库
CSS
XPath
ASP.NET MVC
JavaScript
Jquery
EF
less
ES6
NHibernate
WebApi
第三方应用
消息中间件
Java
Vue
React
vue 3
Layui
editor.md
sea.js
Zepto.js
mysql.js
mssql.js
NodeJs
Express
前端template
YAML
杂项
外部链接
SQL Server关于apply的两种形式cross apply 和 outer apply

apply有两种形式: cross apply 和 outer apply

先看看语法:

  <left_table_expression>  {cross|outer} apply <right_table_expression>

使用apply就像是先计算左输出,然后为左输入中的每一行计算一次右输出。

cross apply和outer apply的区别:

  cross apply 需要左右两个表达式都有输出才显示(类似于Inner Join)

       outer apply 可以允许右边使用NULL来填充(类似于Left join)

运用场景:当左边表达式和右边表达式是一对多的关系时,可以使用apply语法先过滤出右表的数据,再链接输出结果,比如,右表是可以多次审核的审核记录,这时我们要去取最新审核记录来显示就可以使用apply来实现

下面是示例:

用户表:

text_user.png

客户表:

text_cur.png

用户客户关联表:

text_relation.png

CROSS APPLY示例:

SELECT      per.Name 用户, cur.Name 客户, cur.Id 客户编号
FROM        Test.dbo.[User] per
CROSS APPLY (SELECT     TOP 1
                        cur.Name, cur.Id
             FROM       Test.dbo.UserCustomerRelation rela
             INNER JOIN Test.dbo.Customer cur ON cur.Id = rela.CustomerId
             WHERE      per.Id = rela.UserId
             ORDER BY   cur.Id DESC) cur

结果:

cross.png

结果说明:从表中可以看出【曹操】有两个关联的客户【关羽】和【刘备】,但我们只要取他最新的客户的信息,使用CROSS APPLY可以做到,右表达式查询出最新的客户然后与左表达式链接输出结果,top 1 取一条数据,然后用 order by 排序。

OUTER APPLY示例:

SELECT      per.Name 用户, cur.Name 客户, cur.Id 客户编号
FROM        Test.dbo.[User] per
OUTER APPLY (SELECT     TOP 1
                        cur.Name, cur.Id
             FROM       Test.dbo.UserCustomerRelation rela
             INNER JOIN Test.dbo.Customer cur ON cur.Id = rela.CustomerId
             WHERE      per.Id = rela.UserId
             ORDER BY   cur.Id DESC) cur

结果:

outer.png

结果说明:从输出结果可以看出,OUTER APPLY比CROSS APPLY多输出了几条记录,并且是用NULL填充的,结果与LEFT JOIN 类似。这就是两个使用的区别

扫一扫手机看
点击排行
订阅号
...