SQL 关于apply的两种形式cross apply 和 outer apply
 
apply有两种形式: 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的区别:
 
  cross apply和outer apply 总是包含步骤A1,只有outer apply包含步骤A2,如果cross apply左行应用右表表达式时返回空积,则不返回该行。而outer apply返回该行,并且该行的右表表达式的属性为null。
 
看到上面的解释或步骤大家可能还是一头的雾水,不知所云。下面用例子来说明:
 
先建表一([dbo].[Customers]  字段说明:customerid -- 消费者id , city -- 所在城市):
CREATE TABLE [dbo].[Customers](

    [customerid] [char](5) COLLATE Chinese_PRC_CI_AS NOT NULL,

    [city] [varchar](10) COLLATE Chinese_PRC_CI_AS NOT NULL,

PRIMARY KEY CLUSTERED 

(

    [customerid] ASC

)WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]

) ON [PRIMARY]

向表一插入数据:

insert into dbo.Customers values('FISSA','Madrid');

insert into dbo.Customers values('FRNDO','Madrid');

insert into dbo.Customers values('KRLOS','Madrid');

insert into dbo.Customers values('MRPHS','Zion');

查询所插入的数据:

select * from dbo.Customers

结果如图:

再建表二([dbo].[Orders]  字段说明:orderid -- 订单id  , customerid -- 消费者id):

CREATE TABLE [dbo].[Orders](

    [orderid] [int] NOT NULL,

    [customerid] [char](5) COLLATE Chinese_PRC_CI_AS NULL,

PRIMARY KEY CLUSTERED 

(

    [orderid] ASC

)WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]

) ON [PRIMARY]

向表二插入数据:

insert into dbo.Orders values(1,'FRNDO');

insert into dbo.Orders values(2,'FRNDO');

insert into dbo.Orders values(3,'KRLOS');

insert into dbo.Orders values(4,'KRLOS');

insert into dbo.Orders values(5,'KRLOS');

insert into dbo.Orders values(6,'MRPHS');

insert into dbo.Orders values(7,null);

查询插入的数据:

select * from dbo.orders

结果如图:

例子:题目:得到每个消费者最新的两个订单:
 
用cross apply
select *

from dbo.Customers as C

 cross apply

    (select top 2 *

     from dbo.Orders as O

     where C.customerid=O.customerid

     order by orderid desc) as CA

结果如图:

过程分析:
 
  它是先得出左表【dbo.Customers】里的数据,然后把此数据一条一条的放入右表表式中,分别得出结果集,最后把结果集整合到一起就是最终的返回结果集了(T1的数据 像for循环一样 一条一条的进入到T2中 然后返回一个集合  最后把所有的集合整合到一块  就是最终的结果),最后我们再理解一下上面让记着的话(使用apply就像是先计算左输入,让后为左输入中的每一行计算一次右输入)是不是有所明白了。
 
实验:用outer apply 试试看看的到的结果:
 
sql语句:
select *

from dbo.Customers as C

 outer apply

    (select top 2 *

     from dbo.Orders as O

     where C.customerid=O.customerid

     order by orderid desc) as CA

结果如图:

结果分析:
 
  发现outer apply得到的结果比cross多了一行,我们结合上面所写的区别(cross apply和outer apply 总是包含步骤A1,只有outer apply包含步骤A2,如果cross apply左行应用右表表达式时返回空积,则不返回该行。而outer apply返回该行,并且该行的右表表达式的属性为null)就会知道了
 
 

SQL关于apply的两种形式cross apply和outer apply(转载)的更多相关文章

  1. SQL 关于apply的两种形式cross apply 和 outer apply

    SQL 关于apply的两种形式cross apply 和 outer apply 例子: CREATE TABLE [dbo].[Customers]( ) COLLATE Chinese_PRC_ ...

  2. 转:SQL 关于apply的两种形式cross apply 和 outer apply

    原文地址:http://www.cnblogs.com/Leo_wl/archive/2013/04/02/2997012.html SQL 关于apply的两种形式cross apply 和 out ...

  3. SQL 关于apply的两种形式cross apply 和 outer apply(转)

    转载链接:http://www.cnblogs.com/shuangnet/archive/2013/04/02/2995798.html apply有两种形式: cross apply 和 oute ...

  4. SQL 关于apply的两种形式cross apply 和 outer apply, with cube 、with rollup 和 grouping

    1). apply有两种形式: cross apply 和 outer apply先看看语法: <left_table_expression> {cross|outer} apply &l ...

  5. C# ASP.NET(配置数据库 sql server 地址的两种形式以及配置信息的获取)

    ( 1 ) 数据库装在本机,并且采用windows认证模式 <connectionStrings>    <add name="SQLConnectionString&qu ...

  6. 在sql中case子句的两种形式

    case子句,在select后面可以进行逻辑判断. 两种形式:判断相等.判断不等 一.判断相等的语法: case 列名 when ...  then ... when ...  then ... el ...

  7. MyBatis collection的两种形式——MyBatis学习笔记之九

    与association一样,collection元素也有两种形式,现介绍如下: 一.嵌套的resultMap 实际上以前的示例使用的就是这种方法,今天介绍它的另一种写法.还是以教师映射为例,修改映射 ...

  8. 基于 Scrapy-redis 两种形式的分布式爬虫

    基于 Scrapy-redis 两种形式的分布式爬虫 .caret, .dropup > .btn > .caret { border-top-color: #000 !important ...

  9. C++:一般情况下,设计函数的形参只需要两种形式

    C++:一般情况下,设计函数的形参只需要两种形式.一,是引用形参,例如 void function (int &p_para):二,是常量引用形参,例如 void function(const ...

随机推荐

  1. Redis实现分布式锁

    http://redis.io/topics/distlock 在不同进程需要互斥地访问共享资源时,分布式锁是一种非常有用的技术手段. 有很多三方库和文章描述如何用Redis实现一个分布式锁管理器,但 ...

  2. 招聘一个靠谱的iOS》面试题参考答案(上)

    说明:面试题来源是微博@我就叫Sunny怎么了的这篇博文:<招聘一个靠谱的 iOS>,其中共55题,除第一题为纠错题外,其他54道均为简答题. 博文中给出了高质量的面试题,但是未给出答案, ...

  3. Interview Check If n Is A Perfect Square

    Check if a given number is a perfect square with only addition or substraction operation. eg. 25 ret ...

  4. Windows 上使用 cygwin 连接到 docker toolbox

    Windows 上使用 cygwin 连接到 docker toolbox Docker 确实给软件开发带来一些好处,在简化部署.统一开发.测试和生产环境上,有它独到的理念.Linux 上可直接安装 ...

  5. Ubuntu下如何将普通用户提升到root权限

    在ubuntu的系统操作中,我们经常会使用到系统权限的,因为权限不足,导致在一些操作当中非常麻烦.要获取权限,最长使用的方法就是使用sudo指令,但是来回使用还是比较麻烦,有没有直接提升我们的用户权限 ...

  6. MVC项目实践,在三层架构下实现SportsStore-05,实现导航

    SportsStore是<精通ASP.NET MVC3框架(第三版)>中演示的MVC项目,在该项目中涵盖了MVC的众多方面,包括:使用DI容器.URL优化.导航.分页.购物车.订单.产品管 ...

  7. Centos php项目发布问题

    LAMP环境,项目运行错误日志路径:/var/log/httpd 错误日志例如: [Sat Jul :: ] [error] [client , referer: http://192.168.100 ...

  8. 在Matlab中编译c/c++代码需要安装mex

    >> mex -setup Welcome to mex -setup. This utility will help you set up a default compiler. For ...

  9. swift NSUserDefaults的基本使用

    import UIKit @UIApplicationMain class AppDelegate: UIResponder, UIApplicationDelegate { var window: ...

  10. java.net.BindException: Address already in use: JVM_Bind

    是端口占用,如果修改端口后仍提示这样的错误,可能是eclipse自动关闭或正在运行服务非正常中断导致端口没有关闭,这时你再启动,还是提示java.net.BindException: Address  ...