简介

如果你打算为在结果集中的每条记录写一个调用表值函数或者表值表达式的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来链接了dbo.SearchString和dbo.FindProductLike 这个函数取出来的表值。操作符取到了SearchString表的String 字段然后调用表值函数FindProductLike 。所以前两行的结果集取了String 类型为Red的值,并调用函数使得ProductName 中包含Red的数据返回了ProductName Price的列,然后将结果链接在一起;lights 也是一样的道理,而虽然表中含有Star,但是函数中不能匹配到有关Star的值所以不能返回相应的行。

使用OUTER APPLY

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

使用表值表达式

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

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

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

总结:

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

小议如何使用APPLY的更多相关文章

  1. JS核心系列:浅谈 call apply 与 bind

    在JavaScript 中,call.apply 和 bind 是 Function 对象自带的三个方法,这三个方法的主要作用是改变函数中的 this 指向,从而可以达到`接花移木`的效果.本文将对这 ...

  2. SQL Server-聚焦APPLY运算符(二十七)

    前言 其实有些新的特性在SQL Server早就已经出现过,但是若非系统的去学习数据库你会发现在实际项目中别人的SQL其实是比较复杂的,其实利用新的SQL Server语法会更加方便和简洁,从本节开始 ...

  3. 利用apply()或者rest参数来实现用数组传递函数参数

    关于call()和apply()的用法,MDN文档里写的非常清晰明白,在这里就不多做记录了. https://developer.mozilla.org/zh-CN/docs/Web/JavaScri ...

  4. 由js apply与call方法想到的js数据类型(原始类型和引用类型)

    原文地址:由js apply与call方法想到的js数据类型(原始类型和引用类型) js的call方法与apply方法的区别在于第二个参数的不同,他们都有2个参数,第一个为对象(即需要用对象a继承b, ...

  5. JavaScript学习笔记(二)——闭包、IIFE、apply、函数与对象

    一.闭包(Closure) 1.1.闭包相关的问题 请在页面中放10个div,每个div中放入字母a-j,当点击每一个div时显示索引号,如第1个div显示0,第10个显示9:方法:找到所有的div, ...

  6. 瞬间记住Javascript中apply与call的区别

    关于Javascript函数的apply与call方法的用法,网上的文章很多,我就不多话了.apply和call的作用很相似,但使用方式有区别 apply与call的第一个参数都是一个对象,这个对象就 ...

  7. scope.$apply是干嘛的

    开始用angular做项目的时候,一定碰到过$scope.$apply()方法,表面上看,这像是一个帮助你进行数据更新的方法,那么,它为何存在,我们又该如何使用它呢. JavaScript执行顺序 J ...

  8. JavaScript中的apply,call与this的纠缠

    1.apply定义 apply:调用函数,并用指定对象替换函数的 this 值,同时用指定数组替换函数的参数. 语法:apply([thisObj[,argArray]]) thisObj 可选.要用 ...

  9. jQuery之常用且重要方法梳理(siblings,nextAll,end,wrap,apply,call,each)-(二)

    1.siblings() siblings() 获得匹配集合中每个元素的同胞,通过选择器进行筛选是可选的. <body> <div><span>Hello</ ...

随机推荐

  1. 用Supervisord管理Python进程

    http://feilong.me/2011/03/monitor-processes-with-supervisord Supervisord是用Python实现的一款非常实用的进程管理工具,类似于 ...

  2. Eclipse常用的快捷键

    Eclipse常用快捷键 1,       Ctrl+S,保存文档. 2,       Tab,多行同时右移:选中多行 3,       shlft+tab,多行同时左移,选中多行 4,       ...

  3. Delphi 10.1 Berlin UTF8String Test

    Delphi 10.1 Berlin UTF8String Test procedure TForm1.Button1Click(Sender: TObject); var s: UTF8String ...

  4. [转]CSS编码规范

    单行形式书写风格的排版约束 1.      每一条规则的大括号 { 前后加空格 2.      多个selector共用一个样式集,则多个selector必须写成多行形式 3.      每一条规则结 ...

  5. FNV哈希算法

    由来:FNV哈希算法全名为Fowler-Noll-Vo算法,是以三位发明人Glenn Fowler,Landon Curt Noll,Phong Vo的名字来命名的,最早在1991年提出. 特点和用途 ...

  6. 一:【nopcommerce系列】Nop整体架构的简单介绍,在看nop代码之前,你需要懂哪些东西

    首先,我看的是Nop 3.80,最新版 百度资料很多,Nop用到的主要的技术有: 1.Mvc,最新版用的是 5.2.3.0 2.entity framework 3.autofac 4.插件化 5.( ...

  7. [AngularJS] 使用AngularAMD动态加载Controller

    [AngularJS] 使用AngularAMD动态加载Controller 前言 使用AngularJS来开发Single Page Application(SPA)的时候,可以选用AngularU ...

  8. Salvattore:CSS 驱动的 jQuery Masonry 插件

    Salvattore 是一个 jQuery 砌体的替代,使用 CSS 驱动的配置.Salvattore 根据您指定的列数组织你的 HTML 元素.容器中的每一个项目会一个接一个被放置在列内,只需要简单 ...

  9. BookBlock - 效果非常真实的书本翻页预览

    这个名为 BookBlock 的图片预览效果是一个书展示或网上书店的概念,已全屏打开3D页面导航网格的形式显示图书的详细信息.我们可以打开书预览的摘录,其中有一些细节的网格.对于图书预览,我们在使用 ...

  10. 安装运行mariadb时错误:gtid_slave_pos

    精简windows zip包后出现错误: Failed to load slave replication state from table mysql.gtid_slave_pos: 1932: T ...