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


相关推荐

  • Laravel – 验证码(captcha)

    Laravel – 验证码(captcha)

    2021年10月26日
  • mac navicat激活码【中文破解版】

    (mac navicat激活码)JetBrains旗下有多款编译器工具(如:IntelliJ、WebStorm、PyCharm等)在各编程领域几乎都占据了垄断地位。建立在开源IntelliJ平台之上,过去15年以来,JetBrains一直在不断发展和完善这个平台。这个平台可以针对您的开发工作流进行微调并且能够提供…

    2022年3月26日
  • 华为模拟器 eNSP安装教程「建议收藏」

    华为模拟器 eNSP安装教程「建议收藏」随着华为网络设备的日渐普遍,华为网络设备的使用越来越多,学习华为网络路由知识的人也越来越多,华为提供的eNSP模拟软件,能够很好的为初学者提供很好的模拟学习软件。一、准备工作软件:ensp软件为免费软件,可以在华为官网上进行下载,版本:eNSPV100R002C00B320window10操作系统二、安装步骤1、下载eNSP软件:该软件为免费…

    2022年10月14日
  • c语言格式化输出「建议收藏」

    c语言格式化输出「建议收藏」C语言printf指定宽度的格式化输出printf()是一个标准库函数,使用时需要include头文件stdio.h。#include<stdio.h>printf()函数的调用形式为:printf(“格式控制字符串”,输出列表);其中,格式控制字符串用于指定输出格式,有格式字符串和非格式字符串两种形式。格式字符串有%,%后面跟着各种格式字符,用以说明输出数据的类型、形式、长度、小数位等。下面是一些常用的指定宽度的格式化输出例子。格式化占位符(format):%[

    2022年7月24日
  • java中的递归算法_java递归算法详解

    java中的递归算法_java递归算法详解Java中的递归算法虽然简单,但想要精通也是有着一定的难度的,本篇文章我们就来详细了解下递归算法。什么是递归?一般的说,递归算法是一种直接或间接地调用自身的算法。在程序中,递归算法能够使算法的描述简洁而且易于理解。递归分几类?递归通常分为两类,直接递归和间接递归:1、直接递归称为方法自身调用自己。2、间接递归可以A方法调用B方法,B方法调用C方法,C方法调用A方法。递归怎么实现实现?例://递归…

    2022年7月7日
  • Easyui 表单验证「建议收藏」

    Easyui 表单验证「建议收藏」Easyui 表单验证

    2022年4月25日

发表回复

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

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