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 区别详解相关推荐

  1. mysql int(3)与int(11)的区别详解

    这篇文章主要介绍了mysql int(3)与int(11)的区别详解的相关资料,需要的朋友可以参考下 mysql int(3)与int(11)的区别 总结,int(M) zerofill,加上zero ...

  2. MySQL 普通索引和唯一索引的区别详解

    1 概念区分 普通索引和唯一索引 普通索引可重复,唯一索引和主键一样不能重复. 唯一索引可作为数据的一个合法验证手段,例如学生表的身份证号码字段,我们人为规定该字段不得重复,那么就使用唯一索引.(一般 ...

  3. mysql某个表被行锁了_MySQL 行锁和表锁的含义及区别详解

    一.前言 对于行锁和表锁的含义区别,在面试中应该是高频出现的,我们应该对MySQL中的锁有一个系统的认识,更详细的需要自行查阅资料,本篇为概括性的总结回答. MySQL常用引擎有MyISAM和Inno ...

  4. MySQL Installer 8.0.21安装教程图文详解 转载

    MySQL Installer 8.0.21安装教程图文详解 原地址 1. 缘由 刚好需要在新系统上重新安装MySQL,便写了一份的下载安装教程,供查阅,以防日后细节有所遗忘. 2. 版本说明 MyS ...

  5. utf8和utf8mb4的区别详解

    utf8和utf8mb4的区别 一.简介 MySQL在5.5.3之后增加了这个utf8mb4的编码,mb4就是most bytes 4的意思,专门用来兼容四字节的unicode.utf8mb4是utf ...

  6. (转载)MySQL数据库的主键和外键详解

    主键 主键的定义 主键:表中经常有一个列或多列的组合,其值能唯一地标识表中的每一行.这样的一列或多列称为表的主键,通过它可强制表的实体完整性.当创建或更改表时可通过定义 PRIMARY KEY 约束来 ...

  7. decimal类型对象里面定义什么类型_MySQL中Decimal类型和Float Double的区别(详解)

    MySQL中存在float,double等非标准数据类型,也有decimal这种标准数据类型. 其区别在于,float,double等非标准类型,在DB中保存的是近似值,而Decimal则以字符串的形 ...

  8. HashTable和HashMap的区别详解

    HashTable和HashMap的区别详解 一.HashMap简介 HashMap是基于哈希表实现的,每一个元素是一个key-value对,其内部通过单链表解决冲突问题,容量不足(超过了阀值)时,同 ...

  9. java mod %区别_Java中 % 与Math.floorMod() 区别详解

    %为取余(rem),Math.floorMod()为取模(mod) 取余取模有什么区别呢? 对于整型数a,b来说,取模运算或者取余运算的方法都是: 1.求 整数商: c = a/b; 2.计算模或者余 ...

  10. 关于numpy中eye和identity的区别详解

    https://www.jb51.net/article/175386.htm np.identity(n, dtype=None) np.eye(N, M=None, k=0, dtype=< ...

最新文章

  1. ELK环境搭建及client配置
  2. 洛谷 P1149 火柴棒等式
  3. 2.19 总结-深度学习-Stanford吴恩达教授
  4. 【Tools】MarkDown教程(七)-Typora详细教程
  5. Linux操作系统笔记——Shell变量
  6. React Native发布重构路线图
  7. 科目三-变更车道,直线行驶和超车的考试标准
  8. 下一代Windows界面曝光!
  9. 为什么那么多自学WEB前端的人后来都放弃了?
  10. Atitit.ide技术原理与实践attilax总结
  11. 生成器(generator)
  12. hcia题库app有哪些?HCNA题库和考试内容一模一样吗?
  13. 红外图像高低温校正【待补充】
  14. cfree mysql_如何配置CFree才能开发MySql数据库应用
  15. 弘辽科技:淘宝流量下滑了怎么办?淘宝流量下滑应对方法
  16. 关于(archive)归档和(unarchive)解档的处理。
  17. 酷派s6、Coolpad 9190l_C00 无log信息输出解决方法
  18. clock oscillator,generator,buffer选型杂谈
  19. [XJTU计算机网络安全与管理]——第十三讲 攻击与病毒
  20. linux12.040串口驱动,pci串行口驱动下载

热门文章

  1. UA MATH566 统计理论 完备性的证明方法
  2. MSI_MSI-X中断之体验与使用
  3. 在ubuntu18.04上安装vmware
  4. VR全景城市,用720全景树立城市形象,打造3D可视化智慧城市
  5. bootstrap 修改carousel 样式
  6. 选择室内地图提供商时需要考虑的12件事
  7. 语音情感识别常见的声学特征
  8. 【生信分析】一些关于生物信息的常见名字解释
  9. Pandas 日期处理:生成及去除工作日与节假日
  10. OBCA认证知识点-part3