SQL SERVER Cross apply 与Outer apply的真正用法是怎么样的?

小野马1209 2020-12-03 11:58:05
/*Cross apply 与Outer apply的真正用法是怎么样的?
他们与inner join 与Left join 的区别是什么,能用一个简单案例说明下吗,十分感谢
以下的我模拟测试了下Cross apply 与inner join 类似,Outer apply相当于左关联*/
Declare @Studient table (PersonId varchar(50),PersonName Nvarchar(50))
Declare @Score table (PersonId varchar(50),Subject Nvarchar(50),Score INT)
INSERT INTO @Studient
SELECT 'A01','张三' union all
SELECT 'A02','李四' union all
SELECT 'A05','王五'
INSERT INTO @Score
SELECT 'A01','语文',90 union all
SELECT 'A02','数学',95 union all
SELECT 'A03','英语',100

---CROSS APPLY 相当于 SELECT * FROM @Studient A INNER JOIN @Score B ON B.PersonId=A.PersonId
SELECT * FROM @Studient A
CROSS APPLY
(SELECT * FROM @Score B WHERE B.PersonId=A.PersonId) C
/*
PersonId PersonName PersonId Subject Score
A01 张三 A01 语文 90
A02 李四 A02 数学 95
*/

--outer apply 相当于LEFT JOIN
SELECT * FROM @Studient A
outer apply(SELECT * FROM @Score B WHERE B.PersonId=A.PersonId) C
/*
PersonId PersonName PersonId Subject Score
A01 张三 A01 语文 90
A02 李四 A02 数学 95
A05 王五 NULL NULL NULL
*/
...全文
727 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
Mr_Nice 2020-12-04
  • 打赏
  • 举报
回复
引用 3 楼 kaijie_wu1209 的回复:
[quote=引用 2 楼 xiaoxiangqing 的回复:]Cross apply相当于inner join,Outer apply相当于left join
如果是这样,既然有了Left join 和inner join了 为什么还要有Cross apply和Outer apply呢[/quote] 这个主要是两方面: 1. apply方式可以对表值函数进行处理,常见就是
USE master 
GO
 
SELECT DB_NAME(r.database_id) AS [Database], st.[text] AS [Query]  
FROM sys.dm_exec_requests r 
CROSS APPLY sys.dm_exec_sql_text(r.plan_handle) st 
WHERE r.session_Id > 50 
2. 出于性能考虑(参考https://explainextended.com/2009/07/16/inner-join-vs-cross-apply/
Hello World, 2020-12-04
  • 打赏
  • 举报
回复
可以试下把下面语句转为left join:

DECLARE @test TABLE(ID INT IDENTITY, Tags NVARCHAR(1000) NOT NULL)
INSERT @test (Tags) VALUES (N'A,B,C,D,E'),('H,I,J,K')
SELECT * FROM @test a CROSS APPLY (SELECT * FROM dbo.fn_split(tags,',')) b
雨夹雪 2020-12-04
  • 打赏
  • 举报
回复

apply 后面可以连一个表值函数,join 就不行了
select *  from 表 a outer apply dbo.函数(a.字段) b
小野马1209 2020-12-04
  • 打赏
  • 举报
回复
引用 2 楼 xiaoxiangqing 的回复:
Cross apply相当于inner join,Outer apply相当于left join
如果是这样,既然有了Left join 和inner join了 为什么还要有Cross apply和Outer apply呢
xiaoxiangqing 2020-12-04
  • 打赏
  • 举报
回复
Cross apply相当于inner join,Outer apply相当于left join
小野马1209 2020-12-04
  • 打赏
  • 举报
回复
求解答

34,587

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧