SQL Server 关于CROSS APPLY 和 OUTER APPLY应用
<left_table_expression> {cross|outer} apply<right_table_expression>
再让我们了解一下apply运算涉及的两个步骤:
A1:把右表表达式(<right_table_expression>)应用到左表(<left_table_expression>)输入的行
A2:添加外部行;
使用apply就像是先计算左输入,然后为左输入中的每一行计算一次右输入。(这一句很重要,可能会不理解,但要先记住,后面会有详细的说明)
最后结合以上两个步骤说明cross apply和outer apply的区别:
crossapply和outer apply 总是包含步骤A1,只有outer apply包含步骤A2,如果crossapply左行应用右表表达式时返回空积,则不返回该行。而outer apply返回该行,并且该行的右表表达式的属性为null。
看到上面的解释或步骤大家可能还是一头的雾水,不知所云。
下面用例子来说明:
--表一([dbo].[Customers] 字段说明:customerid--消费者id, city -- 所在城市):
CREATE TABLE [dbo].[Customers](
[customerid][char](5)NOTNULL,
[city][varchar](10)NOTNULL,
PRIMARY KEY CLUSTERED ( [customerid]ASC)WITH(IGNORE_DUP_KEY=OFF)ON [PRIMARY]
) ON [PRIMARY]
--向表一插入数据:
insert into dbo.Customersvalues('FISSA','Madrid');
insert into dbo.Customersvalues('FRNDO','Madrid');
insert into dbo.Customersvalues('KRLOS','Madrid');
insert into dbo.Customersvalues('MRPHS','Zion');
--表二([dbo].[Orders] 字段说明:orderid--订单id ,customerid -- 消费者id):
CREATE TABLE [dbo].[Orders](
[orderid] [int]NOT NULL,
[customerid][char](5)NULL,
PRIMARY KEY CLUSTERED ([orderid]ASC)WITH(IGNORE_DUP_KEY=OFF)ON [PRIMARY]
) ON [PRIMARY]
--向表二插入数据:
insert into dbo.Ordersvalues(1,'FRNDO');
insert into dbo.Ordersvalues(2,'FRNDO');
insert into dbo.Ordersvalues(3,'KRLOS');
insert into dbo.Ordersvalues(4,'KRLOS');
insert into dbo.Ordersvalues(5,'KRLOS');
insert into dbo.Ordersvalues(6,'MRPHS');
insert into dbo.Ordersvalues(7,null);
--查询插入的数据:
select *from dbo.Customers
select *from dbo.orders
结果:
customerid city
---------- ----------
FISSA Madrid
FRNDO Madrid
KRLOS Madrid
MRPHS Zion
(4 行受影响)
orderid customerid
----------- ----------
1 FRNDO
2 FRNDO
3 KRLOS
4 KRLOS
5 KRLOS
6 MRPHS
7 NULL
(7 行受影响)
【例子】得到每个消费者最新的两个订单:
1、用cross apply
SELECT *
FROM dbo.CustomersAS A
CROSS APPLY( SELECT TOP 2 *
FROM dbo.OrdersAS B
WHERE A.customerid= B.customerid
ORDER BY orderid DESC
) AS AB;
结果:
customerid city orderid customerid
---------- ---------- ---------------------
FRNDO Madrid 2 FRNDO
FRNDO Madrid 1 FRNDO
KRLOS Madrid 5 KRLOS
KRLOS Madrid 4 KRLOS
MRPHS Zion 6 MRPHS
过程分析:
它是先得出左表【dbo.Customers】里的数据,然后把此数据一条一条的放入右表表式中,分别得出结果集,最后把结果集整合到一起就是最终的返回结果集了(T1的数据 像for循环一样 一条一条的进入到T2中 然后返回一个集合 最后把所有的集合整合到一块 就是最终的结果),最后我们再理解一下上面让记着的话(使用apply就像是先计算左输入,让后为左输入中的每一行计算一次右输入)。
2、用outer apply
SELECT *
FROM dbo.CustomersAS A
OUTER APPLY( SELECT TOP 2
*
FROM dbo.OrdersAS B
WHERE A.customerid= B.customerid
ORDER BY orderid DESC
) AS AB;
结果:
customerid city orderid customerid
---------- ---------- ---------------------
FISSA Madrid NULL NULL
FRNDO Madrid 2 FRNDO
FRNDO Madrid 1 FRNDO
KRLOS Madrid 5 KRLOS
KRLOS Madrid 4 KRLOS
MRPHS Zion 6 MRPHS
结果分析:
发现outerapply得到的结果比cross多了一行,我们结合上面所写的区别(cross apply和outer apply 总是包含步骤A1,只有outer apply包含步骤A2,如果cross apply左行应用右表表达式时返回空积,则不返回该行。而outerapply返回改行,并且改行的右表表达式的属性为null)就会知道了。
【例二】
;with tb1(客户号,销售日期,销售额)AS(
select '001','2017-05-01',460 union all
select '001','2017-05-02',240 union all
select '001','2017-05-03',300
),TB2(客户号,付款额)AS(
select '001',500
)
SELECT t1.客户号 ,
t1.销售日期 ,
t1.销售额 ,
CASE WHEN t2.付款额 <= ISNULL(tt1.p_销售额, 0) THEN 0
ELSE CASE WHEN ( ISNULL(p_销售额, 0) + t1.销售额 ) >= t2.付款额
THEN t2.付款额 - ISNULL(p_销售额, 0)
ELSE t1.销售额
END
END AS 实付额
FROM tb1 AS t1
CROSS APPLY ( SELECT SUM(付款额) AS 付款额
FROM TB2
WHERE TB2.客户号 = t1.客户号
) AS t2
OUTER APPLY ( SELECT SUM(销售额) AS p_销售额
FROM tb1 AS tt
WHERE tt.客户号 = t1.客户号
AND tt.销售日期 < t1.销售日期
) AS tt1;
--结果
客户号 销售日期 销售额 实付额
---- ---------- ----------- -----------
001 2017-05-01 460 460
001 2017-05-02 240 40
001 2017-05-03 300 0
SQL Server 关于CROSS APPLY 和 OUTER APPLY应用的更多相关文章
- SQL Server中CROSS APPLY和OUTER APPLY的应用详解
SQL Server数据库操作中,在2005以上的版本新增加了一个APPLY表运算符的功能.新增的APPLY表运算符把右表表达式应用到左表表达式中的每一行.它不像JOIN那样先计算那个表表达式都可以, ...
- SQL Server连接查询之Cross Apply和Outer Apply的区别及用法(转载)
先简单了解下cross apply的语法以及会产生什么样的结果集吧!示例表: SELECT * FROM tableA CROSS APPLY tableB 两张表直接连接,不需要任何的关联条件,产生 ...
- <转>SQL Server CROSS APPLY and OUTER APPLY
Problem SQL Server 2005 introduced the APPLY operator, which is like a join clause and it allows joi ...
- SQL Server中CROSS APPLY和OUTER APPLY应用
1.什么是Cross Apply和Outer Apply ? 我们知道SQL Server 2000中有Cross Join用于交叉联接的.实际上增加Cross Apply和Outer Apply是用 ...
- SQL SERVER使用 CROSS APPLY 与 OUTER APPLY 连接查询
概述 CROSS APPLY 与 OUTER APPLY 可以做到: 左表一条关联右表多条记录时,我需要控制右表的某一条或多条记录跟左表匹配的情况. 有两张表:Student(学生表)和 S ...
- SQL 关于apply的两种形式cross apply 和 outer apply
SQL 关于apply的两种形式cross apply 和 outer apply 例子: CREATE TABLE [dbo].[Customers]( ) COLLATE Chinese_PRC_ ...
- SQL 关于apply的两种形式cross apply 和 outer apply(转)
转载链接:http://www.cnblogs.com/shuangnet/archive/2013/04/02/2995798.html apply有两种形式: cross apply 和 oute ...
- SQL关于apply的两种形式cross apply和outer apply(转载)
SQL 关于apply的两种形式cross apply 和 outer apply apply有两种形式: cross apply 和 outer apply 先看看语法: <lef ...
- 转:SQL 关于apply的两种形式cross apply 和 outer apply
原文地址:http://www.cnblogs.com/Leo_wl/archive/2013/04/02/2997012.html SQL 关于apply的两种形式cross apply 和 out ...
随机推荐
- 安装Visual Studio 2013以及简单使用
首先,在网上找到安装Visual Studio 2013的教程以及相关软件资源http://jingyan.baidu.com/article/09ea3ede3b2496c0afde3944.htm ...
- SoftwareEngineering Individual Project - Word frequency program
说实话前面c#实在没怎么学过.这次写起来感觉非常陌生,就连怎么引用名空间都忘记了.在经过恶补后还是慢慢地适应了. 1.项目预计用时: 构建并写出大概的数据结构,程序框架及模块: 30min 实现文件夹 ...
- M1/M2阶段总结
之前提问的博客 问题解答 问题 1 关于代码复审,复审者是否应该参与编码?如果复审者也参与编码的话,那么难免任务量较多,但如果不参与编码的话,工作分配的似乎不太均衡. 我们的团队项目在M1和M2阶段没 ...
- 个人作业week7——前端开发感想总结
个人作业week7——前端开发感想总结 1. 反思 首先要谈谈在这次团队项目的工作中,我这边出现过的较为严重的一个问题:我和HoerWing (后端担当)合作时,最初因为我没有使用github(始终连 ...
- 转【c语言】两个堆栈组成一个队列
假设有两个堆栈,分别是s1,s2,现在有数列“1,2,3,4,5”,要让这个数列实现先进先出的功能,也就是用两个堆栈组成一个队列,如何实现? 分析: 先将数列压入栈s1,数列在栈中由顶到底的元素为“5 ...
- 【论文笔记】Domain Adaptation via Transfer Component Analysis
论文题目:<Domain Adaptation via Transfer Component Analysis> 论文作者:Sinno Jialin Pan, Ivor W. Tsang, ...
- JavaScript使用childNodes和children
childNodes用来获取一个元素的所有子元素,这个包括元素节点和文本节点. children用来获取一个元素的子元素节点,注意只是元素节点 其中DOM中常见的三种节点分别如下: 元素节点:< ...
- Vert.x简介
https://vertx.io/ https://vertx.io/download/ https://baike.baidu.com/item/Vert.x 近年来,移动网络.社交网络和电商的兴起 ...
- App Store转让App
转让前提条件:①App在App Store能找到 ②该App没有正在审核中的版本 iOS在App Store转让App的详细步骤, 每一步都有图,照图一步一步来就OK 1.获得接收App的苹果 ...
- Fantacy团队周一站立会议
词频分析模型 1.首先这次站会是周一开的,但是由于我个人的疏忽,没有落实到博客上,请见谅,连累了组长. 2.会议时间:2016年3月28日12:00~12:30. 持续时长:30分钟 会议参加成员:组 ...