Sql Server中不常用的表运算符之APPLY(1)
写在这个系列的前面:
就像他们的名字一样,作为一个表运算,他们用来运算左表和右表。JOIN也是一个表运算符,不过他太常用了。
APPLY:
将右表表达式应用在左表的每一行上。
APPLY是Sql2005对SQL语句的拓展,这意味着其他类型的数据库可能不支持这个表运算符。微软设计APPLY的初衷在于将表值函数运用在左表的每一行,并将结果与对应行关联起来。
网上大多数文章中提到的也是这样的用法,例如我们有一个Split(s,splitChar)表值函数,可以将一个字符串s用splitChar分割,返回分割后的表。
现在有这样一张表:dbo.ApplyCase1
| s |
| swer,23,wer,234 |
| wer,wer,234 |
下面这个查询将会把Split这个表值函数(右表表达式)运用在dbo.ApplyCase1(左表表达式)中的每一行上,并把结果与对应行关联。
SELECT s,ct.strValue FROM dbo.ApplyCase1 AS ac CROSS APPLY dbo.Split(s,',') ct WHERE ct.strValue<>ac.s
where 可以无视,主要是为了与INNER JOIN相比较。结果如下
| s | strValue |
| swer,23,wer,234 | swer |
| swer,23,wer,234 | 23 |
| swer,23,wer,234 | wer |
| swer,23,wer,234 | 234 |
| wer,wer,234 | wer |
| wer,wer,234 | wer |
| wer,wer,234 | 234 |
这里可以看出APLLY的两个特点
1.将右表表达式应用在左表的每一行上。
2.右表表达式可以使用左表中的列。
假如我们换成如下查询则会报错
SELECT s,ct.strValue FROM dbo.ApplyCase1 AS ac INNER JOIN dbo.Split(s,',') ct ON ct.strValue<>ac.s
错误如下
Msg 207, Level 16, State 1, Line 1
Invalid column name 's'.
因为INNER JOIN无法直接使用左表的列,而只能在ON过滤中通过比较来建立左表和右表的联系。
Sql Server中不常用的表运算符之APPLY(1)的更多相关文章
- Sql Server中不常用的表运算符之APPLY(2)
在Sql Server中不常用的表运算符之APPLY(1)中提到,SQL2005中新支持的APPLY的特性:1.可以直接将表表达式(表值函数或者子查询)作为APPLY语句的右表连接左表.2.由于使用A ...
- Sql Server中不常用的表运算符之UNPIVOT
在Sql Server中不常用的表运算符之PIVOT中,介绍了PIVOT表运算符,现在来说说与之相对应的另一个表运算符UNPIVOT. 从名字可以看出,这个运算符的作用与PIVOT刚好相反,是将一行的 ...
- Sql Server中不常用的表运算符之PIVOT
PIVOT是SQL Server2005新添加的一个表运算符,作用在于将行转为列. 先来看看他的基本语法: 来自http://technet.microsoft.com/zh-cn/library/m ...
- SQL Server中,常用的全局变量
在SQL Server中,全局变量是一种特殊类型的变量,服务器将维护这些变量的值.全局变量以@@前缀开头,不必进行声明,它们属于系统定义的函数.下表就是SQL Server中一些常用的全局变量. 全局 ...
- SQL Server中查询数据库及表的信息语句
/* -- 本文件主要是汇总了 Microsoft SQL Server 中有关数据库与表的相关信息查询语句. -- 下面的查询语句中一般给出两种查询方法, -- A方法访问系统表,适应于SQL 20 ...
- SQL Server中的临时表和表变量
SQL Server中的临时表和表变量 作者:DrillChina出处:blog2008-07-08 10:05 在SQL Server的性能调优中,有一个不可比拟的问题:那就是如何在一段需要长时间的 ...
- sql Server中临时表与数据表的区别
sql server 中临时表与数据表的区别 1.如何判断临时表和数据表已生成 --如何判断临时表是否已创建--- if exists(select * from tempdb..sysobjects ...
- 转:Sql Server中清空所有数据表中的记录
如果要删除数据表中所有数据只要遍历一下数据库再删除就可以了,清除所有数据我们可以使用搜索出所有表名,构造为一条SQL语句进行清除了,这里我一一给各位同学介绍. 使用sql删除数据库中所有表是不难的 ...
- Sql Server中清空所有数据表中的记录
Sql Server中清空所有数据表中的记录 清空所有数据表中的记录: 代码如下:exec sp_msforeachtable @Command1 ='truncate table ?'删除所有数据 ...
随机推荐
- javascript 要点
javascript 要点 1 JavaScript:写入 HTML 输出 document.write("<h1>This is a heading</h1>&qu ...
- git服务器新增仓库
在已有的git库中搭建新的库,并将本地的git仓库,上传到服务器的git库中,从而开始一个新的项目. 首先是在本地操作: 在本地新建文件夹spider,进入到spider中:如下
- printf 整数类型都用 uint8_t
#include <iostream> #include <string> #include <tuple> #include <utility> ...
- jquery 监听所有锚点链接实现平滑移动
jquery 监听所有锚点链接实现平滑移动,地址栏上不会改变链接地址 //监听所有锚点链接实现平滑移动 $('a[href*=#],area[href*=#]').click(function() { ...
- HDFS snapshot操作实战
Hadoop从2.1.0版开始提供了HDFS SnapShot的功能.一个snapshot(快照)是一个全部文件系统.或者某个目录在某一时刻的镜像.快照在下面场景下是非常有用:防止用户的错误操作:管理 ...
- GDB 调试 一些命令
1. gdb查看指定地址的内存地址的值:examine 简写 x-----使用gdb> help x 来查看使用方式 x/ (n,f,u为可选参数)n: 需要显示的内存单元个数,也就是从 ...
- .NET4.5 异步编程 async和await
msdn介绍:https://msdn.microsoft.com/zh-cn/library/hh191443.aspx 其实很简单,标记了async的方法为异步方法,从方法的左大括号开始同步执行, ...
- 关于litJson的System.InvalidCastException
最近在做一个Unity3D的项目,用到了litJson库, 它比JavaScript里的JSON解析更加严格, 有时候解析数据的时候会出现类型不对. 比如说 {"data":12} ...
- C#实现堆栈
堆栈(Stack)是一种特殊的线性表,是一种操作只允许在尾端进行插入或删除等操作的线性表.表尾允许进行插入删除操作,称为栈顶(Top),另一端是固定的,称为栈底(Bottom).栈的操作使按照先进后出 ...
- 01-C#入门(调试和错误处理)
老实说,这一章没有什么要写的,很多都是实操性的东西. 调试方法 可以使用Debug.WriteLine().Trace.WriteLine()输入调试信息到窗体下的输出窗口,不过没怎么用过,比较有用的 ...