sql server cross/outer apply 用法
这是 sql server 帮助文档关于apply的描述:
使用 APPLY 运算符(2005或以上版本)可以为实现查询操作的外部表表达式返回的每个行调用表值函数。表值函数作为右输入,外部表表达式作为左输入。通过对右输入求值来获得左输入每一行的计算结果,生成的行被组合起来作为最终输出。APPLY 运算符生成的列的列表是左输入中的列集,后跟右输入返回的列的列表。
APPLY 有两种形式: CROSS APPLY 和 OUTER APPLY。CROSS APPLY 仅返回外部表中通过表值函数生成结果集的行。OUTER APPLY 既返回生成结果集的行,也返回不生成结果集的行,其中表值函数生成的列中的值为 NULL。
看一下例子:
select * from table1 join MyFunction(1) on 1=1
MyFunction 的参数是一个常量,可以返回一个表。
但有时候我们希望以 table1 的字段作为参数,传进函数去计算,像:
select * from table1 join MyFunction(id) on 1=1
这样是会出错的。这个时候我们就可以用 apply 来实现了。例如:
select * from table1 cross apply MyFunction(id) on 1=1
简单的说,apply 允许我们将前面结果集每一行的数据作为参数,传递到后面的表达式,后面的表达式可以是一个表值函数,或者select结果集。
实际项目应用:
产品表和点击率统计表,按产品最近一个月点击率排序。
如果不用apply,实现起来就比较麻烦,用 apply 实现起来大概就是这样的:
;with cteResult as(
select row_number() over(order by HitCount) as rowid,
ProductID,
ProductName
from ProductInfo pi with(nolock)
outer apply(select sum(HitCount) HitCount from HitStatisticsInfo hsi
where hsi.TargetID = pi.ProductID
and hsi.HitTime >= '2015-08-08'
group by TargetID) hsi
where pi.IsDel = 0)
select * from cteResult where rowid between 1 and 20
至于 cross apply 与 outer apply 的区别就好像left join 与 join 的区别。如果 apply 不生成行,outer apply 也会返回该行,而 cross apply 则不会输出该行。
so,当你在需要将某个字段的值作为参数使用时,或者用join实现起来比较复杂时,就可以考虑apply来实现。
sql server cross/outer apply 用法的更多相关文章
- SQL Server Cross/Outer Apply
SQL Server2005引入了APPLY运算符,它非常像连接子句,它允许两个表达式直接进行连接,即将左/外部表达式和右/内部表达式连接起来. CROSS APPLY(类比inner join)和O ...
- SQL语句 - MERGE INTO 、Cross/Outer Apply用法理解
MERGE INTO 语法: MERGE INTO table_name alias1 USING (table|view|sub_query) alias2ON (join condition) W ...
- <转>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 中 GO 的用法2
具体不废话了,请看下文详解. 1 2 3 4 5 6 7 8 9 10 use db_CSharp go select *, 备注=case when Grade>=90 then '成绩 ...
- Sql Server cross apply和outer apply
with result as( select t.str from( ' str union all ' str union all ' str union all ' str union all ' ...
- Oracle ->> Oracle下实现SQL Server的TOP + APPLY
今晚很好奇想知道Oracle下有没有APPLY子句?如果有那怎么实现SQL Server下的TOP + APPLY.结果自己写了个例子. with a as ( order by grp_factor ...
- SQL Server 中 GO 的用法(转)
本科里学了那么多年SQL Server一直看到书上各种SQL语句中间夹杂着那么几个看似毫无意义的GO,看着就让人莫名,问老师,老师一般只会告诉你,不要理他,这个东西没用的.但是个性纠结并且有轻微强迫症 ...
- SQL SERVER 中 GO 的用法
用信号通知 Microsoft® SQL Server™ 实用工具一批 Transact-SQL 语句的结束.GO 不是 Transact-SQL 语句:而是可为 osql 和 isql 实用工具及 ...
- [转]SQL Server 存储过程 一些常用用法(事物、异常捕捉、循环)
最新更新请访问: http://denghejun.github.io Transact-SQL中的存储过程,非常类似于Java语言中的方法,它可以重复调用.当存储过程执行一次后,可以将语句缓存中 ...
随机推荐
- JQ常用代码
页面加载的时候添加一个定时器,0秒之后执行hideURLbar函数. hideURLbar函数将页面滚动至坐标(0,1) <script type="application/x-jav ...
- ArcGIS API for Silverlight 使用GeometryService求解线与线的交点
///画线 void btn_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) { Button btn = sender as B ...
- [ jquery 过滤器 hasClass(class) ] 此方法用于在选择器的基础之上检查当前的元素是否含有某个特定的类,如果有,则返回true
此方法用于在选择器的基础之上检查当前的元素是否含有某个特定的类,如果有,则返回true 实例: <!DOCTYPE html> <html lang='zh-cn'> < ...
- Android Touch事件传递机制 二:单纯的(伪生命周期)
转载于:http://blog.csdn.net/yuanzeyao/article/details/38025165 在前一篇文章中,我主要讲解了Android源码中的Touch事件的传递过程,现在 ...
- iOS 中常用的对密码进行MD5加密
iOS中MD5加密 标签(空格分隔): iOS MD5 + (NSString *)MD5:(NSString *)str { const char *cStr = [str UTF8String]; ...
- Linux0.11内核--引导程序分析
1.简介 本文主要介绍三个文件bootsect.s.setup.s.head.s,主要是做了些从软盘加载内核和设置32位保护模式的操作. 2.程序分析 当PC电源打开后,BIOS自检后将bootsec ...
- CSS3制作动画的三个属性
CSS3属性中有关于制作动画的三个属性:Transform,Transition,Animation:我们一起学习完了Transform和Transition,让我们对元素实现了一些基本的动画效果,这 ...
- spring-boot 热部署 intellij IDE
1.使用springloadded插件: 如何使用: a.先在ide里面部署好你的service,( mvn spring-boot:run) b.修改代码, c.command+F9(或build- ...
- RunTime&RunLoop初见
什么是runtime 1> runtime是一套底层的c语言API(包括很多强大实用的c语言类型,c语言函数); 2>实际上,平时我们编写的oc代码,底层都是基于runtime实现的 也就 ...
- lable计算行高
_introduce.text=status.introduce; //设置行间距 NSMutableAttributedString *attributedString = [[NSMutableA ...