SQL Server中CROSS APPLY和OUTER APPLY的应用详解

SQL Server数据库操作中,在2005以上的版本新增加了一个APPLY表运算符的功能。新增的APPLY表运算符把右表表达式应用到左表表达式中的每一行。它不像JOIN那样先计算那个表表达式都可以,APPLY必选先逻辑地计算左表达式。这种计算输入的逻辑顺序允许吧右表达式关联到左表表达式。

APPLY有两种形式,一个是OUTER APPLY,一个是CROSS APPLY,区别在于指定OUTER,意味着结果集中将包含使右表表达式为空的左表表达式中的行,而指定CROSS,则相反,结果集中不包含使右表表达式为空的左表表达式中的行。

例1:CROSS APPLY 形式

比如:LargeTable表中的某一列存储的数据是以“:”号分隔的数据,我们处理的时候,可能要先把这个值,先分隔,然后把分隔后的每个值单独一行放在一张表中,然后对这个表做处理。

原始数据(LargeTable表):
  

为了简单,我们先拿其中id=2的一行处理,这些以:号分隔的数据,可能是我们某张表的主键(t1),我们可能需要把这些数值提出来,放在一张临时表中,和t1表关联,做一些处理。

处理这个分隔的数据结果如下图:

如果用之前的版本处理这个操作的话,应该很发杂,暂时没想到怎么处理,如果有人实现过,可以提示一下。

这只是用其中一行做的处理,如果我们用上图的3行都做这样处理,把三行以:号分隔的数值都放在一个表中,该怎么处理呢?

今天的主角APPLY该闪亮登场了。用APPLY表运算符一行语句就能处理以上操作。

  1. SELECT a FROM dbo.LargeTable AS LT--实际表  
  2. CROSS APPLY dbo.split(LT.Name,':')--自定义表值函数,处理以某个字符分隔的数据,把这些数据,返回一张表  
  3. WHERE a <> '' --去掉结果表中a字段为空的数据 

处理的结果如下图:

是不是很简单。

需要额外定义的就是那个自定义表值函数(split),这是我在网上找的,类似.Net中Split操作,代码如下:

使用方法:

  1. SELECT * FROM dbo.split('581::579::519::279::406::361::560',':')  
  2. ALTER Function [dbo].[Split](@Sql varchar(8000),@Splits varchar(10))  
  3. returns @temp Table (a varchar(100))  
  4. As  
  5. Begin  
  6. Declare @i Int  
  7. Set @Sql = RTrim(LTrim(@Sql))  
  8. Set @i = CharIndex(@Splits,@Sql)  
  9. While @i >= 1  
  10. Begin  
  11. Insert @temp Values(Left(@Sql,@i-1))  
  12. Set @Sql = SubString(@Sql,@i+1,Len(@Sql)-@i)  
  13. Set @i = CharIndex(@Splits,@Sql)  
  14. End 
  1. If @Sql <> ''  
  2. Insert @temp Values (@Sql)  
  3. Return  
  4. End 

例2:OUTER APPLY 形式

场景:有个供货商表(Supplier)和供货商产品表(Products),我们要取每一个供货商中单价***的两个产品。

供货商表:

供货商产品表:

首先,我们创建一个自定义表值函数(dbo.fn_top_products),该函数根据供货商ID返回单价***的两个商品。  好,前期的数据都已经准备好了,下面让我们试试用OUTER APPLY形式来查询,会出现什么结果。

  1. IF OBJECT_ID('dbo.fn_top_products') IS NOT NULL  
  2. DROP FUNCTION dbo.fn_top_products;  
  3. GO 

–根据供货商ID获得单价***的两件商品

  1. CREATE FUNCTION dbo.fn_top_products  
  2. (@supid AS INT)  
  3. RETURNS TABLE  
  4. AS  
  5. RETURN  
  6. SELECT TOP(2)Id AS ProductId,ProductName,UnitPrice  
  7. FROM dbo.Products  
  8. WHERE SupplierId = @supid  
  9. ORDER BY UnitPrice DESC  
  10. GO 

执行以下语句:

  1. SELECT S.id AS SupplierId,S.CompanyName,UnitPrice FROM dbo.Supplier AS S  
  2. OUTER APPLY dbo.fn_top_products(S.id) AS P 

执行结果如下:

注意***为NULL的记录,reed公司因为没有商品,所以单价为NULL了。

如果用CROSS APPLY形式,执行以下查询:

  1. SELECT S.id AS SupplierId,S.CompanyName,UnitPrice FROM dbo.Supplier AS S  
  2. CROSS APPLY dbo.fn_top_products(S.id) AS P 

生成的输出结果如下:

大家看出OUTER APPLY和CROSS APPLY的区别了吧。

再次说一下APPLY的执行过程,它先逻辑计算左表表达式(以上的LargeTable表),然后把右表达式(以上的自定义表值函数Split)应用到左表表达式的每一行。实际是把外部查询的列引用作为参数传递给表值函数。

以上就是SQL Server数据库APPLY表运算符的应用实例,希望能够对您有所帮助。

【编辑推荐】

  1. SQL Server链接服务器访问DB2设置步骤图解
  2. 初学SQL Server存储过程的一些简单操作示例
  3. T-SQL查询中基于列的逻辑表达式的查询详解
  4. SQL Server实践性练习之创建库表及条件查询
  5. SQL Server中通过设置SET NOCOUNT来优化存储过程

文章来源网络,作者:运维,如若转载,请注明出处:https://shuyeidc.com/wp/304066.html<

(0)
运维的头像运维
上一篇2025-05-25 13:26
下一篇 2025-05-25 13:28

相关推荐

  • 个人主题怎么制作?

    制作个人主题是一个将个人风格、兴趣或专业领域转化为视觉化或结构化内容的过程,无论是用于个人博客、作品集、社交媒体账号还是品牌形象,核心都是围绕“个人特色”展开,以下从定位、内容规划、视觉设计、技术实现四个维度,详细拆解制作个人主题的完整流程,明确主题定位:找到个人特色的核心主题定位是所有工作的起点,需要先回答……

    2025-11-20
    0
  • 社群营销管理关键是什么?

    社群营销的核心在于通过建立有温度、有价值、有归属感的社群,实现用户留存、转化和品牌传播,其管理需贯穿“目标定位-内容运营-用户互动-数据驱动-风险控制”全流程,以下从五个维度展开详细说明:明确社群定位与目标社群管理的首要任务是精准定位,需明确社群的核心价值(如行业交流、产品使用指导、兴趣分享等)、目标用户画像……

    2025-11-20
    0
  • 香港公司网站备案需要什么材料?

    香港公司进行网站备案是一个涉及多部门协调、流程相对严谨的过程,尤其需兼顾中国内地与香港两地的监管要求,由于香港公司注册地与中国内地不同,其网站若主要服务内地用户或使用内地服务器,需根据服务器位置、网站内容性质等,选择对应的备案路径(如工信部ICP备案或公安备案),以下从备案主体资格、流程步骤、材料准备、注意事项……

    2025-11-20
    0
  • 如何企业上云推广

    企业上云已成为数字化转型的核心战略,但推广过程中需结合行业特性、企业痛点与市场需求,构建系统性、多维度的推广体系,以下从市场定位、策略设计、执行落地及效果优化四个维度,详细拆解企业上云推广的实践路径,精准定位:明确目标企业与核心价值企业上云并非“一刀切”的方案,需先锁定目标客户群体,提炼差异化价值主张,客户分层……

    2025-11-20
    0
  • PS设计搜索框的实用技巧有哪些?

    在PS中设计一个美观且功能性的搜索框需要结合创意构思、视觉设计和用户体验考量,以下从设计思路、制作步骤、细节优化及交互预览等方面详细说明,帮助打造符合需求的搜索框,设计前的规划明确使用场景:根据网站或APP的整体风格确定搜索框的调性,例如极简风适合细线条和纯色,科技感适合渐变和发光效果,电商类则可能需要突出搜索……

    2025-11-20
    0

发表回复

您的邮箱地址不会被公开。必填项已用 * 标注