mysql outer apply_CROSS APPLY和 OUTER APPLY 区别详解
SQL Server2005新增crossapply 和outerapply 联接语句,增加这两个东东有啥作用呢?
我们知道有个 SQL Server2000中有个cross join是用于交叉联接的。实际上增加crossapply 和outerapply 是用于交叉联接表值函数(返回表结果集的函数)的, 更重要的是这个函数的参数是另一个表中的字段。这个解释可能有些含混不请,请看下面的例子:--1. cross join 联接两个表select *fromTABLE_1asT1cross joinTABLE_2asT2--2. cross join 联接表和表值函数,表值函数的参数是个“常量”select *fromTABLE_1 T1cross joinFN_TableValue(100)--3. cross join 联接表和表值函数,表值函数的参数是“表T1中的字段”select *fromTABLE_1 T1cross joinFN_TableValue(T1.column_a)
Msg4104,Level 16, State1, Line1The multi-part identifier "T1.column_a" couldnotbe bound.
最后的这个查询的语法有错误。在cross join时,表值函数的参数不能是表 T1 的字段, 为啥不能这样做呢?我猜可能微软当时没有加这个功能:),后来有客户抱怨后, 于是微软就增加了crossapply 和outerapply 来完善,请看crossapply,outerapply 的例子:--4. cross applyselect *fromTABLE_1 T1crossapply FN_TableValue(T1.column_a)--5. outer applyselect *fromTABLE_1 T1outerapply FN_TableValue(T1.column_a)crossapply 和outerapply 对于 T1 中的每一行都和派生表(表值函数根据T1当前行数据生成的动态结果集) 做了一个交叉联接。crossapply 和outerapply 的区别在于: 如果根据 T1 的某行数据生成的派生表为空,crossapply 后的结果集 就不包含 T1 中的这行数据,而outerapply 仍会包含这行数据,并且派生表的所有字段值都为NULL。
下面的例子摘自微软 SQL Server2005联机帮助,它很清楚的展现了crossapply 和outerapply 的不同之处:--cross applyselect *fromDepartmentsasDcrossapply fn_getsubtree(D.deptmgrid)asST
deptid deptname deptmgrid empid empname mgrid lvl----------- ----------- ----------- ----------- ----------- ----------- ------1HR22Andrew101HR25Steven211HR26Michael212Marketing77Robert302Marketing711David712Marketing712Ron712Marketing713Dan712Marketing714James1123Finance88Laura304R&D99Ann305Training44Margaret105Training410Ina41(12row(s) affected)--outer applyselect *fromDepartmentsasDouterapply fn_getsubtree(D.deptmgrid)asST
deptid deptname deptmgrid empid empname mgrid lvl----------- ----------- ----------- ----------- ----------- ----------- ------1HR22Andrew101HR25Steven211HR26Michael212Marketing77Robert302Marketing711David712Marketing712Ron712Marketing713Dan712Marketing714James1123Finance88Laura304R&D99Ann305Training44Margaret105Training410Ina416GardeningNULLNULLNULLNULLNULL(13row(s) affected)
注意outerapply 结果集中多出的最后一行。 当 Departments 的最后一行在进行交叉联接时:deptmgrid 为NULL,fn_getsubtree(D.deptmgrid) 生成的派生表中没有数据,但outerapply 仍会包含这一行数据,这就是它和cross join的不同之处。
下面是完整的测试代码,你可以在 SQL Server2005联机帮助上找到:--create Employees table and insert valuesIF OBJECT_ID('Employees')IS NOT NULLDROP TABLEEmployeesGOCREATE TABLEEmployees
(
empidINT NOT NULL,
mgridINT NULL,
empnameVARCHAR(25)NOT NULL,
salaryMONEY NOT NULL)GOIF OBJECT_ID('Departments')IS NOT NULLDROP TABLEDepartmentsGO--create Departments table and insert valuesCREATE TABLEDepartments
(
deptidINT NOT NULL PRIMARY KEY,
deptnameVARCHAR(25)NOT NULL,
deptmgridINT)GO--fill datasINSERT INTOemployeesVALUES(1,NULL,'Nancy',00.00)INSERT INTOemployeesVALUES(2,1,'Andrew',00.00)INSERT INTOemployeesVALUES(3,1,'Janet',00.00)INSERT INTOemployeesVALUES(4,1,'Margaret',00.00)INSERT INTOemployeesVALUES(5,2,'Steven',00.00)INSERT INTOemployeesVALUES(6,2,'Michael',00.00)INSERT INTOemployeesVALUES(7,3,'Robert',00.00)INSERT INTOemployeesVALUES(8,3,'Laura',00.00)INSERT INTOemployeesVALUES(9,3,'Ann',00.00)INSERT INTOemployeesVALUES(10,4,'Ina',00.00)INSERT INTOemployeesVALUES(11,7,'David',00.00)INSERT INTOemployeesVALUES(12,7,'Ron',00.00)INSERT INTOemployeesVALUES(13,7,'Dan',00.00)INSERT INTOemployeesVALUES(14,11,'James',00.00)INSERT INTOdepartmentsVALUES(1,'HR',2)INSERT INTOdepartmentsVALUES(2,'Marketing',7)INSERT INTOdepartmentsVALUES(3,'Finance',8)INSERT INTOdepartmentsVALUES(4,'R&D',9)INSERT INTOdepartmentsVALUES(5,'Training',4)INSERT INTOdepartmentsVALUES(6,'Gardening',NULL)GO--SELECT * FROM departments--table-value functionIF OBJECT_ID('fn_getsubtree')IS NOT NULLDROP FUNCTIONfn_getsubtreeGOCREATE FUNCTIONdbo.fn_getsubtree(@empid AS INT)RETURNS TABLEASRETURN(WITHEmployees_Subtree(empid, empname, mgrid, lvl)AS(--Anchor Member (AM)SELECTempid, empname, mgrid,0FROMemployeesWHEREempid= @empidUNION ALL--Recursive Member (RM)SELECTe.empid, e.empname, e.mgrid, es.lvl+1FROMemployeesASejoinemployees_subtreeASesONe.mgrid=es.empid
)SELECT * FROMEmployees_Subtree
)GO--cross apply querySELECT *FROMDepartmentsASDCROSSAPPLY fn_getsubtree(D.deptmgrid)ASST--outer apply querySELECT *FROMDepartmentsASDOUTERAPPLY fn_getsubtree(D.deptmgrid)ASST
mysql outer apply_CROSS APPLY和 OUTER APPLY 区别详解相关推荐
- mysql int(3)与int(11)的区别详解
这篇文章主要介绍了mysql int(3)与int(11)的区别详解的相关资料,需要的朋友可以参考下 mysql int(3)与int(11)的区别 总结,int(M) zerofill,加上zero ...
- MySQL 普通索引和唯一索引的区别详解
1 概念区分 普通索引和唯一索引 普通索引可重复,唯一索引和主键一样不能重复. 唯一索引可作为数据的一个合法验证手段,例如学生表的身份证号码字段,我们人为规定该字段不得重复,那么就使用唯一索引.(一般 ...
- mysql某个表被行锁了_MySQL 行锁和表锁的含义及区别详解
一.前言 对于行锁和表锁的含义区别,在面试中应该是高频出现的,我们应该对MySQL中的锁有一个系统的认识,更详细的需要自行查阅资料,本篇为概括性的总结回答. MySQL常用引擎有MyISAM和Inno ...
- MySQL Installer 8.0.21安装教程图文详解 转载
MySQL Installer 8.0.21安装教程图文详解 原地址 1. 缘由 刚好需要在新系统上重新安装MySQL,便写了一份的下载安装教程,供查阅,以防日后细节有所遗忘. 2. 版本说明 MyS ...
- utf8和utf8mb4的区别详解
utf8和utf8mb4的区别 一.简介 MySQL在5.5.3之后增加了这个utf8mb4的编码,mb4就是most bytes 4的意思,专门用来兼容四字节的unicode.utf8mb4是utf ...
- (转载)MySQL数据库的主键和外键详解
主键 主键的定义 主键:表中经常有一个列或多列的组合,其值能唯一地标识表中的每一行.这样的一列或多列称为表的主键,通过它可强制表的实体完整性.当创建或更改表时可通过定义 PRIMARY KEY 约束来 ...
- decimal类型对象里面定义什么类型_MySQL中Decimal类型和Float Double的区别(详解)
MySQL中存在float,double等非标准数据类型,也有decimal这种标准数据类型. 其区别在于,float,double等非标准类型,在DB中保存的是近似值,而Decimal则以字符串的形 ...
- HashTable和HashMap的区别详解
HashTable和HashMap的区别详解 一.HashMap简介 HashMap是基于哈希表实现的,每一个元素是一个key-value对,其内部通过单链表解决冲突问题,容量不足(超过了阀值)时,同 ...
- java mod %区别_Java中 % 与Math.floorMod() 区别详解
%为取余(rem),Math.floorMod()为取模(mod) 取余取模有什么区别呢? 对于整型数a,b来说,取模运算或者取余运算的方法都是: 1.求 整数商: c = a/b; 2.计算模或者余 ...
- 关于numpy中eye和identity的区别详解
https://www.jb51.net/article/175386.htm np.identity(n, dtype=None) np.eye(N, M=None, k=0, dtype=< ...
最新文章
- ELK环境搭建及client配置
- 洛谷 P1149 火柴棒等式
- 2.19 总结-深度学习-Stanford吴恩达教授
- 【Tools】MarkDown教程(七)-Typora详细教程
- Linux操作系统笔记——Shell变量
- React Native发布重构路线图
- 科目三-变更车道,直线行驶和超车的考试标准
- 下一代Windows界面曝光!
- 为什么那么多自学WEB前端的人后来都放弃了?
- Atitit.ide技术原理与实践attilax总结
- 生成器(generator)
- hcia题库app有哪些?HCNA题库和考试内容一模一样吗?
- 红外图像高低温校正【待补充】
- cfree mysql_如何配置CFree才能开发MySql数据库应用
- 弘辽科技:淘宝流量下滑了怎么办?淘宝流量下滑应对方法
- 关于(archive)归档和(unarchive)解档的处理。
- 酷派s6、Coolpad 9190l_C00 无log信息输出解决方法
- clock oscillator,generator,buffer选型杂谈
- [XJTU计算机网络安全与管理]——第十三讲 攻击与病毒
- linux12.040串口驱动,pci串行口驱动下载