小议如何使用APPLY
简介
如果你打算为在结果集中的每条记录写一个调用表值函数或者表值表达式的select语句,那么你就能用到APPLY 操作符来实现。一般又两种形式写法:
第一种格式就是CROSS APPLY。这种格式可以一方面从表或者结果集中的每一行数据中取出几列数值,另一方面将取出的数据作为输入条件得到表的函数值或者表达式。每个调用表值函数或者表达式的返回行将被连接在一起,然后所有的行将通过UNION ALL 连接在一起。如果表值函数没有返回行数据由于引用了一个特殊的函数调用,那么表和结果集的行里面将不会被包含在最终的结果,因为它不能被连接在一起与任何表值函数的行。
第二种格式就是使用OUTER APPLY,这个操作符与第一种类似,但是多了额外的返回列,就是当调用的函数或者表达式没有返回任何行时,已然能够与表或者查询结果集关联在一起,只是函数和表达式返回的列为null。
为了更好地理解我们将通过几个实例来展示一下效果和作用:
测试数据和功能实例
首先我们要创建一些测试数据以及表值函数。如下:
|
USE test; CREATE TABLE dbo.Product CREATE TABLE dbo.SearchString INSERT INTO dbo.SearchString CREATE FUNCTION dbo.FindProductLike |
我创建了一个包含五种不同产品的表叫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的更多相关文章
- JS核心系列:浅谈 call apply 与 bind
在JavaScript 中,call.apply 和 bind 是 Function 对象自带的三个方法,这三个方法的主要作用是改变函数中的 this 指向,从而可以达到`接花移木`的效果.本文将对这 ...
- SQL Server-聚焦APPLY运算符(二十七)
前言 其实有些新的特性在SQL Server早就已经出现过,但是若非系统的去学习数据库你会发现在实际项目中别人的SQL其实是比较复杂的,其实利用新的SQL Server语法会更加方便和简洁,从本节开始 ...
- 利用apply()或者rest参数来实现用数组传递函数参数
关于call()和apply()的用法,MDN文档里写的非常清晰明白,在这里就不多做记录了. https://developer.mozilla.org/zh-CN/docs/Web/JavaScri ...
- 由js apply与call方法想到的js数据类型(原始类型和引用类型)
原文地址:由js apply与call方法想到的js数据类型(原始类型和引用类型) js的call方法与apply方法的区别在于第二个参数的不同,他们都有2个参数,第一个为对象(即需要用对象a继承b, ...
- JavaScript学习笔记(二)——闭包、IIFE、apply、函数与对象
一.闭包(Closure) 1.1.闭包相关的问题 请在页面中放10个div,每个div中放入字母a-j,当点击每一个div时显示索引号,如第1个div显示0,第10个显示9:方法:找到所有的div, ...
- 瞬间记住Javascript中apply与call的区别
关于Javascript函数的apply与call方法的用法,网上的文章很多,我就不多话了.apply和call的作用很相似,但使用方式有区别 apply与call的第一个参数都是一个对象,这个对象就 ...
- scope.$apply是干嘛的
开始用angular做项目的时候,一定碰到过$scope.$apply()方法,表面上看,这像是一个帮助你进行数据更新的方法,那么,它为何存在,我们又该如何使用它呢. JavaScript执行顺序 J ...
- JavaScript中的apply,call与this的纠缠
1.apply定义 apply:调用函数,并用指定对象替换函数的 this 值,同时用指定数组替换函数的参数. 语法:apply([thisObj[,argArray]]) thisObj 可选.要用 ...
- jQuery之常用且重要方法梳理(siblings,nextAll,end,wrap,apply,call,each)-(二)
1.siblings() siblings() 获得匹配集合中每个元素的同胞,通过选择器进行筛选是可选的. <body> <div><span>Hello</ ...
随机推荐
- php中数组遍历改值
<?php $arr = array(100, 99, 88, 77, 55, 66); //方法1 foreach ($arr as &$v) { $v = 2; } print_r( ...
- GJM : Unity3D 常用网络框架与实战解析 【笔记】
Unity常用网络框架与实战解析 1.Http协议 Http协议 存在TCP 之上 有时候 TLS\SSL 之上 默认端口80 https 默认端口 ...
- Java中的GOF23(23中设计模式)--------- 单例模式(Singleton)
Java中的GOF23(23中设计模式)--------- 单例模式(Singleton) 在Java这这门语言里面,它的优点在于它本身的可移植性上面,而要做到可移植的话,本身就需要一个中介作为翻译工 ...
- tomcat 7下spring 4.x mvc集成websocket以及sockjs完全参考指南
之所以sockjs会存在,说得不好听点,就是因为微软是个流氓,现在使用windows 7的系统仍然有近半,而windows 7默认自带的是ie 8,有些会自动更新到ie 9,但是大部分非IT用户其实都 ...
- java集合-Iterator迭代
我们常常使用 JDK 提供的迭代接口进行 Java 集合的迭代. Iterator iterator = list.iterator(); while(iterator.hasNext()){ Str ...
- Nginx学习随笔
题外话 第一份工作中项目中有DBA和运维,所以平时也只关注开发部分,对数据库和服务器关注比较少,记得那时有用户反馈网站很慢,老大让我联系运维看看是不是服务器的问题,那时也不知道Nginx是个什么东西. ...
- Ifvisible.js – 判断网页中的用户是闲置还是活动状态
ifvisible.js 是一个跨浏览器.轻量级的方式,用户检查用户在浏览页面或正在与它进行交互.它可以处理活动状态,如在页面上空闲或活跃.您还可以使用 ifvisible.js 智能设置您的间隔,如 ...
- io.js - 兼容 NPM 平台的 Node.js 新分支
io.js(JavaScript I/O)是兼容 NPM 平台的 Node.js 新分支,由 Node.js 的核心开发者在 Node.js 的基础上,引入更多的 ES6 特性,它的目的是提供更快的和 ...
- sharepoint app 开发环境配置
1. 配置脚本如下: .通过打开命令提示符并键入以下命令来确保 spadmin 和 sptimer 服务正在运行. net start spadminv4 net start sptimerv4 .作 ...
- Web自动化测试 Selenium 1/3
Selenium 名字的来源 在这里,我还想说一下关于 Selenium 名字的来源,很有意思的 : > : Selenium 的中文名为 “ 硒 ” ,是一种化学元素的名字,它 对 汞 ( M ...


