34,587
社区成员
发帖
与我相关
我的任务
分享
/*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
*/
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/)
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
apply 后面可以连一个表值函数,join 就不行了
select * from 表 a outer apply dbo.函数(a.字段) b