SQL Server连接查询之Cross Apply和Outer Apply的区别及用法

先简单了解下cross apply的语法以及会产生什么样的结果集吧!
示例表:

 

SELECT * FROM tableA CROSS APPLY tableB

两张表直接连接,不需要任何的关联条件,产生的结果就是这两张表的笛卡尔积 

 相当于:select * from tableA,tableB
与之对应的还有Outer Apply,下面讲解一下Cross Apply 和 Outer Apply 的区别:
首先是Cross Apply:

SELECT * FROM tableA a CROSS APPLY (select * from tableB where id=a.id) b

 这个结果集和 select * from tableA a inner join tableB b on a.id=b.id 一模一样,这就相当于inner join 的连接查询嘛!当然,你也可以这样写:

SELECT * FROM tableA a CROSS APPLY tableB b WHERE a.id=b.id

结果集一模一样无差别!
其次是Outer Apply:

SELECT * FROM tableA a OUTER APPLY (select * from tableB where id=a.id) b

发现了吧!这个结果集和left join连接查询产生的结果集一模一样~
同时,发现Cross Apply 和 Cross Join 的区别了没?
Cross Apply 可以在关联表子查询中用前一个关联表的字段的值,而Cross Join 却不行,比如这样写:SELECT * FROM tableA a CROSS JOIN (select * from tableB where id=a.id) b,语法上就不能通过!
因此Cross Join 很鸡肋,既然有Cross Apply了,那么Cross Join几乎毫无存在的价值~

另一种用法:

SELECT * FROM 
(
    SELECT 1 AS ID,'A,B,C,D' AS B 
    UNION ALL
    SELECT 2 AS ID,'D,E' AS B
    UNION ALL
    SELECT 3 AS ID,'F,G' AS B
) A cross apply fn_SplitString(A.B,',') v

 

posted @   每天进步多一点  阅读(479)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek “源神”启动!「GitHub 热点速览」
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
· DeepSeek R1 简明指南:架构、训练、本地部署及硬件要求
· 2 本地部署DeepSeek模型构建本地知识库+联网搜索详细步骤
历史上的今天:
2020-12-06 Mysql自定义变量的作用
点击右上角即可分享
微信分享提示