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 ?'删除所有数据 ...
随机推荐
- 在macos上利用vmware fusion安装Ubuntu
1. 安装vmware fusion http://www.vmware.com/products/fusion 下载以后,可以在网上找注册码,最好下载最新的,这里下载的是7的版本 2. 下载ubun ...
- createjs easal.js制作了一个很简单的链路图
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title&g ...
- shell script
一.shell script的编写与执行 1.shell script 的编写中还需要用到下面的注意事项: a.命令的执行是从上到下,从左到右地分析与执行 b.命令.参数间的多个空白都会被忽略掉 c. ...
- log4cplus 直接创建logger 对象
#include <log4cplus/loggingmacros.h> #include <log4cplus/fileappender.h> #include <lo ...
- Apache配置文件服务器
配置Apache文件服务器: apache配置文件服务器httpd.conf中这两个模块必须不被注释LoadModule autoindex_module modules/mod_autoindex. ...
- windows下CMake使用图文手册 Part 2
例子2:有目录的项目 我现在有个文件夹ProjectDate,有如下文件结构 E:. │ CMakeLists.txt │ ├─include │ Date.h │ └─src ...
- MySQL For Windows修改最大连接数
1.从官网下载安装MySQL Installer.MySQL Installer 提供了简单易用.向导式的 MySQL 软件的安装体验过程(目前只支持 Windows),包含的产品有: MySQL S ...
- [JavaScript]顺序的异步执行
我们知道,在适用js的时候,程序是单线程执行的,而且如果遇到阻塞就会将浏览器卡死. 能否异步的执行,让程序不再卡呢? 可以,用setTimeout. 但是,问题又来了,如果我有这样的要求: 执行一个函 ...
- MyEclipse 激活
2014版,需要注意的几个问题: 1.安装路径不要有空格: 2.输入usercode-systemid-tools rebyild-active-tools replace-tools-save; 3 ...
- java时间类简单总结
java时间类(Data类) 1.Data类(没有考虑到国际化,好多方法已过时java.util.Data包中) 父类(是类不是接口含有直接子类3个): 日期格式为:年月日时分秒(不包含毫秒部分) ...