小议如何使用APPLY

小议如何使用APPLY

简介

如果你打算为在结果集中的每条记录写一个调用表值函数或者表值表达式的select语句,那么你就能用到APPLY 操作符来实现。一般又两种形式写法:

第一种格式就是CROSS APPLY。这种格式可以一方面从表或者结果集中的每一行数据中取出几列数值,另一方面将取出的数据作为输入条件得到表的函数值或者表达式。每个调用表值函数或者表达式的返回行将被连接在一起,然后所有的行将通过UNION ALL 连接在一起。如果表值函数没有返回行数据由于引用了一个特殊的函数调用,那么表和结果集的行里面将不会被包含在最终的结果,因为它不能被连接在一起与任何表值函数的行。

第二种格式就是使用OUTER APPLY,这个操作符与第一种类似,但是多了额外的返回列,就是当调用的函数或者表达式没有返回任何行时,已然能够与表或者查询结果集关联在一起,只是函数和表达式返回的列为null。

为了更好地理解我们将通过几个实例来展示一下效果和作用:

测试数据和功能实例

首先我们要创建一些测试数据以及表值函数。如下:

USE test;
GO
IF object_id(‘dbo.Product’) IS NOT NULL
    DROP TABLE dbo.Product;
IF object_id(‘dbo.SearchString’) IS NOT NULL
    DROP TABLE dbo.SearchString;
IF object_id(‘dbo.FindProductLike’) IS NOT NULL
    DROP FUNCTION dbo.FindProductLike;

CREATE TABLE dbo.Product
    (
      ID INT IDENTITY ,
      ProductName VARCHAR(100) ,
      Price MONEY
    );
INSERT  INTO dbo.Product
VALUES  ( ‘Red Santa Suit’, 199.99 ),
        ( ‘Candy Canes’, 1.99 ),
        ( ‘Fake Snow’, 2.99 ),
        ( ‘Red Bells’, 49.99 ),
        ( ‘LED Lights’, 6.99 );

CREATE TABLE dbo.SearchString
    (
      ID INT IDENTITY ,
      String VARCHAR(100)
    );

INSERT  INTO dbo.SearchString
VALUES  ( ‘Red’ ),
        ( ‘Lights’ ),
        ( ‘Star’ );
GO

CREATE FUNCTION dbo.FindProductLike
    (
      @FindString VARCHAR(100)
    )
RETURNS TABLE
AS
RETURN
    ( SELECT    ProductName ,
                Price
      FROM      dbo.Product
      WHERE     ProductName LIKE ‘%’ + @FindString + ‘%’
    )

 

我创建了一个包含五种不同产品的表叫Product和一个叫SearchString 的表,它包含了三个不同的strings。最后我又创建了一个叫FindProductLike的函数,包含一个传入参数FindString,实现功能为: 在Product中找到所有产品名称包含传入参数值得所有数据。

使用CROSS APPLY

这个操作符将执行一个表值函数为每行关联在 在结果集中的数据,我们用下面的小例子来展示一下效果:

Cross apply

 

假如你回顾代码,能发现,我使用CROSS APPLY来链接了dbo.SearchString和dbo.FindProductLike 这个函数取出来的表值。操作符取到了SearchString表的String 字段然后调用表值函数FindProductLike 。所以前两行的结果集取了String 类型为Red的值,并调用函数使得ProductName 中包含Red的数据返回了ProductName Price的列,然后将结果链接在一起;lights 也是一样的道理,而虽然表中含有Star,但是函数中不能匹配到有关Star的值所以不能返回相应的行。

使用OUTER APPLY

与CROSS APPLY功能相似。唯一的不同是CROSS APPLY即使没有匹配到任何行在函数中,已然能够链接表中的数据并在本来应该有函数表现的列上填充null。如图:

outer apply

 

使用表值表达式

到目前为止我们仅仅展示了APPLY 在一个结果集和一个表值函数之间的例子。当然它也是能与一个表值表达式一起应用的。来看看具体如何实现,如图:

cross apply2

正如实例中表现的一样,我们也能通过使用表值表达式的形式来实现之前调用表值函数实现的结果。同样的,我们也能对表值表达式使用

OUTER APPLY 来实现外链接。这个例子我就不再列举了,有兴趣的可以自己尝试一下。

总结:

APPLY操作符,让我们能够将结果集中的行与表值函数或者表值表达式中的结果连接在一起。通过使用操作符我们能很快实现一下之前复杂的表链接或者是相关子查询等等T-SQL语句,使得代码简介高效。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/119736.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • LoadRunner 11 安装及激活成功教程

    LoadRunner 11 安装及激活成功教程注意事项:  安装前,把所有的杀毒软件和防火墙关闭。  若以前安装过LoadRunner,则将其卸载。  安装路径不要带中文字符。  如果系统为WIN7,旗舰版才能安装。  安装完毕,需激活成功教程

    2022年7月22日
    22
  • 面试必会系列 – 1.8 Spring IOC / AOP原理

    面试必会系列 – 1.8 Spring IOC / AOP原理Spring原理概览IOCAOPIOCSpringIOC常用注解使用注解的方式将bean注册到IOC容器中这四个注解写在类上面的时候,都可以完成注册bean的功能,但是这些规定并不是spring识别的依据在spring运行过程中,不会对这4个注解做任何区分,看起来都是一样的,都会完成bean的注册功能在实际开发中,最好能分清楚,提高代码的可读性@Component组件,理论上可以在任何位置添加,在扫描的时候都会完成bean的注册。最偷懒的方式,就是给所有需要注

    2022年6月15日
    28
  • 有序的四字成语_LinkedHashMap

    有序的四字成语_LinkedHashMapHashMap是无序的,HashMap在put的时候是根据key的hashcode进行hash然后放入对应的地方。所以在按照一定顺序put进HashMap中,然后遍历出HashMap的顺序跟put的顺序不同(除非在put的时候key已经按照hashcode排序号了,这种几率非常小)单纯的HashMap是无法实现排序的,这的排序是指,我们将键值对按照一定的顺序put进HashMap里,然后在进行

    2022年9月23日
    4
  • screenflow怎么录屏_mac录屏软件 带声音

    screenflow怎么录屏_mac录屏软件 带声音ScreenFlow8forMac是一款集屏幕录制和视频编辑为一体的软件,全新版本screenflowformac中文版已经更新,新版本带来跟踪缩略图、手绘注释、可拆卸编辑时间线、快速旁白和配音添加、刻录字幕等新功能,还有更多改进,赶紧来体验一下吧!ScreenFlow8forMac官方介绍ScreenFlow®是专为macOS设计的屡获殊荣的屏幕录制和视频编辑软件。凭借高质量的屏幕,视频,音频和iOS捕捉,极其强大的编辑功能以及新的StockMediaLibrary选项,

    2022年9月24日
    2
  • nmtui网络配置命令

    nmtui网络配置命令nmtui 网络配置命令 nmtui 提供基于光标的文本用户界面 TUI nmtui 可提供一个文本界面来与 NetworkManag 交互用于配置网络 该工具包含在 NetworkManag tui 子软件包中 通常不会默认随 NetworkManag 的安装而安装该子软件包 需要单独安装 NetworkManag tui 一 nmtui 命令会开启一个图形化的配置工具 通过 nmtui 提供的 GUI 界面 可以编辑连接 启动连接 设置主机名 如果对连接的概念不理解可以参考这篇文章 RHE

    2025年6月21日
    3
  • 验证码暴力破解测试[通俗易懂]

    验证码暴力破解测试测试原理和方法找回密码功能模块中通常会将用户凭证(一般为验证码)发送到用户自己才可以看到的手机号或者邮箱中,只要用户不泄露自己的验证码就不会被攻击者利用,但是有些应用程序在验证码发送功能模块中验证码位数及复杂性较弱,也没有对验证码做次数限制而导致验证码可被暴力枚举并修改任意用户密码。在测试验证码是否可以被暴力枚举时,可以先将验证码多次发送给自己的账号,观察验…

    2022年4月11日
    230

发表回复

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

关注全栈程序员社区公众号