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


相关推荐

  • 初识LVS,lvs/dr和lvs/nat lvs/tun

    初识LVS,lvs/dr和lvs/nat lvs/tun

    2021年8月10日
    50
  • 什么是黑盒测试?它的常用方法有哪些?[通俗易懂]

    什么是黑盒测试?它的常用方法有哪些?[通俗易懂]什么是黑盒测试?它的常用方法有哪些?一:什么是黑盒测试?黑盒测试(Black-boxTesting),黑盒测试又称为“功能测试”,是将测试对象看做一个黑盒,在并不考虑软件产品的内部结构和处理过程的基础上对软件产品进行功能测试。黑盒测试注重软件产品的“功能性需求”。二:黑盒测试常用的方法有哪些?运用黑盒技术设计测试用例常用的方法有:①等价类划分②边界值分析③因果图分析法④错误推断法等详细分析:(一)等价类划分:等价类的划分无非就两种情况:有效等价类、无效等价类1.有效等

    2022年10月3日
    0
  • BufferedWriter输出流的使用「建议收藏」

    BufferedWriter输出流的使用「建议收藏」packagecom.lzxa.analyze.common;importjava.io.*;importjava.text.DateFormat;importjava.text.SimpleDateFormat;importjava.util.Date;/***输入流*/publicclassIOBufferedWriter{static…

    2022年6月1日
    29
  • 移除word文档的域代码 remove all field codes of word[通俗易懂]

    移除word文档的域代码 remove all field codes of word[通俗易懂]去除word中因使用mendeley或endnote等文献管理软件而产生的域代码。网上很多说使用CTRL+SHIFT+F9,但亲测不行,可能是软件版本问题。使用以下方法解决:CTRL+A全选文章;CTRL+6去除全文域代码。参考:https://community.endnote.com/t5/EndNote-Styles-Filters-and/Removing-field-codes-adjusts-spacing-in-Word-document/td-p/152892http

    2022年6月10日
    139
  • pytest重试_pytest失败重跑

    pytest重试_pytest失败重跑安装:pip3installpytest-rerunfailures重新运行所有失败用例要重新运行所有测试失败的用例,请使用–reruns命令行选项,并指定要运行测试的最大次数:$py

    2022年7月30日
    3
  • Word修改默认字体

    Word修改默认字体在Win10的最近一次更新后,发现我的office365默认字体都给我改成等线,什么鬼,以前都是宋体,现在这个还真的不习惯,就动手修改默认字体,设置如下: 1、在word空白处点击鼠标右键,选择字体。 2、在弹出框设置样式(字体、大小等),设置完成之后点击设置默认值3、选择如下,点击确定即可。后面再创建word就默认是设置的字体以及大小。…

    2022年6月13日
    38

发表回复

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

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