SQL Server CROSS APPLY和OUTER APPLY的应用详解
![preview](https://dl-preview.csdnimg.cn/12835445/0001-e4c4fda4c6b5c71fe7360c002affe425_thumbnail.jpeg)
![preview-icon](https://csdnimg.cn/release/downloadcmsfe/public/img/scale.ab9e0183.png)
SQL Server中的CROSS APPLY和OUTER APPLY是两种特殊的表运算符,它们在2005版本及以上引入,主要用于处理复杂的数据转换和联接操作。这些运算符的主要区别在于如何处理右表表达式的结果。 CROSS APPLY用于执行内联联接,它会将右表表达式应用到左表表达式的每一行,但只有当右表表达式返回非空结果时,才会将该行包含在最终结果集中。这意味着,如果左表的一行在应用右表表达式后没有匹配的值,那么这行将不会出现在结果集中。以下是一个CROSS APPLY的例子: ```sql SELECT a FROM dbo.LargeTable AS LT CROSS APPLY dbo.Split(LT.Name, ':') WHERE a <> '' ``` 在这个例子中,`LargeTable`的`Name`列包含用冒号分隔的值,`Split`是一个自定义的表值函数,它将字符串分割成多个行。CROSS APPLY将`Split`函数应用到`LargeTable`的每一行,并只保留那些在分割后`a`字段非空的行。 相对的,OUTER APPLY则执行外联接,它会保留左表的所有行,即使在应用右表表达式后没有返回值。如果右表表达式对左表的某行返回空结果,那么结果集中对应的行将包含NULL值。这个特性使得在外联接中可以处理所有左表的行,无论是否能找到匹配的右表数据。 ```sql SELECT a FROM dbo.LargeTable AS LT OUTER APPLY dbo.Split(LT.Name, ':') WHERE a IS NOT NULL ``` 在这个OUTER APPLY的示例中,即使在`Split`函数应用后某些行的`a`字段为NULL,这些行仍会被包含在结果集中。 在SQL Server 2000中,我们通常使用CROSS JOIN来实现简单的交叉联接,但是当试图将表值函数的参数设置为另一表的字段时,会出现问题,因为CROSS JOIN不支持这种操作。例如: ```sql -- 错误示例:CROSS JOIN无法接受表字段作为表值函数的参数 select * from TABLE_1 T1 cross join FN_TableValue(T1.column_a) ``` 为了解决这个问题,SQL Server 2005引入了CROSS APPLY和OUTER APPLY,它们允许表值函数的参数引用其他表的字段。这样,我们可以写出如下正确的语句: ```sql -- 正确示例:使用CROSS APPLY select * from TABLE_1 T1 cross apply FN_TableValue(T1.column_a) -- 或者使用OUTER APPLY select * from TABLE_1 T1 outer apply FN_TableValue(T1.column_a) ``` 总的来说,CROSS APPLY和OUTER APPLY为SQL Server提供了更灵活的数据处理能力,特别是处理涉及复杂转换或依赖于其他表字段的表值函数的情况。通过理解这两种运算符的工作原理,我们可以编写出更加高效且适应性强的SQL查询。
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![docx](https://img-home.csdnimg.cn/images/20210720083331.png)
![msi](https://img-home.csdnimg.cn/images/20210720083646.png)
![7z](https://img-home.csdnimg.cn/images/20210720083312.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![thumb](https://img-home.csdnimg.cn/images/20210720083646.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![](https://csdnimg.cn/release/download_crawler_static/12835445/bg1.jpg)
![avatar-default](https://csdnimg.cn/release/downloadcmsfe/public/img/lazyLogo2.1882d7f4.png)
![avatar](https://profile-avatar.csdnimg.cn/default.jpg!1)
- 粉丝: 4
- 资源: 932
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助
![voice](https://csdnimg.cn/release/downloadcmsfe/public/img/voice.245cc511.png)
![center-task](https://csdnimg.cn/release/downloadcmsfe/public/img/center-task.c2eda91a.png)
最新资源
- 公司自助餐管理系统数据库文件
- CSP比赛经验分享:从入门到提高 CSP比赛中的一些经验和心得
- python贪吃蛇完整代码
- 中学排课管理系统数据库文件
- Python 简易文件系统模拟:设计一个简单的文件系统,实现文件的创建、读写、删除和目录管理等操作,可以考虑文件权限、路径解
- SSA-CNN-LSTM麻雀算法优化卷积长短期记忆神经网络数据分类预测(Matlab完整源码和数据)
- 电子商务平台的基础功能:实现商品管理、购物车功能、订单处理和支付流程等基本功能
- 简单的游戏开发:开发一个简单的文字冒险游戏或者基于控制台的小游戏,涉及游戏规则、角色动作等实现
- 掌握Objective-C编程:从入门到进阶
- STM32串口3发送AT指令控制ESP8266
![feedback](https://img-home.csdnimg.cn/images/20220527035711.png)
![feedback-tip](https://img-home.csdnimg.cn/images/20220527035111.png)
![dialog-icon](https://csdnimg.cn/release/downloadcmsfe/public/img/green-success.6a4acb44.png)