小议如何使用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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 学习双拼必看(最全教程):双拼输入法的心得以及快速入门办法

    学习双拼必看(最全教程):双拼输入法的心得以及快速入门办法1.简单介绍一下双拼2.总共18种双拼方案3.15种双拼方案的具体映射4.顺便提一下双拼口诀的事情5.总结不同平台选择的方案双拼(也称双打)是一种建立在拼音输入法基础上的输入方法,可视为全拼的一种改进,它通过将汉语拼音中每个含多个字母的声母或韵母各自映射到某个按键上,使得每个音都可以用两个按键打出,极大地提高了拼音输入法的输入速度。这种声母或韵母到按键的对应表通常称之为双…

    2022年6月16日
    91
  • Delphi2007 下安装ActiveX控件[通俗易懂]

    Delphi2007 下安装ActiveX控件[通俗易懂]此英文文章来自codegear官方网站,但是是讲在BDS2006 下如何安装,我在delphi2007下用此方法,一样通过,原文如下 Description:HowtoimportanActiveXcontrolinBDS2006?Answer/Solution:Herestheprocedureforimportingandinstalling

    2022年5月14日
    37
  • J2EE是什么,主要包括哪些技术[通俗易懂]

    J2EE是什么,主要包括哪些技术[通俗易懂]https://blog.csdn.net/Ashes18/article/details/73614571最近最为深刻的认识:被面试老师问到了的知识,哪些是在自己心中模棱两可,似是而非的概念都一目了然。而后,只有在顿悟中不断总结才能进步。今天,我总结的部分是J2EE到底是什么东西,它包括了哪些技术。一、J2EE是什么?从整体上讲,J2EE是使用Java技术开发企业级应用的工业标准,它…

    2022年10月11日
    4
  • 几种 IO编程比较

    几种 IO编程比较参考:Netty权威指南第一版Java网络IO编程总结(BIO、NIO、AIO均含完整实例代码)1.传统的BIO模型通常由一个独立的Acceptor线程负责监听客户端的连接,它接收到客户端连接请求之后为每个客户端创建一个新的线程进行处理,处理完之后,通过流返回应答给客户端,线程销毁。这就是典型的—请求—应答通信模型。该模型最大的问题就是缺乏弹性伸缩能力,当客户端并发量增加后,服务端的线程

    2022年4月30日
    40
  • RxJS之组合操作符 ( Angular环境 )

    RxJS之组合操作符 ( Angular环境 )

    2022年4月2日
    62
  • webservice技术介绍

    一、WebService到底是什么?   一言以蔽之:WebService是一种跨编程语言和跨操作系统平台的远程调用技术。   所谓跨编程语言和跨操作平台,就是说服务端程序采用java编写,客户端程序则可以采用其他编程语言编写,反之亦然!跨操作系统平台则是指服务端程序和客户端程序可以在不同的操作系统上运行。    所谓远程调用,就是一台计算机a上的一个程序可以调用到另外一台

    2022年4月5日
    109

发表回复

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

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