sqlserver中cross apply与outer apply用法

sqlserver中cross apply与outer apply用法apply有两种形式:crossapply和outerapply先看看语法:  <left_table_expression>{cross|outer}apply<right_table_expression>再让我们了解一下apply运算涉及的两个步骤:A1:把右表表达式(<right_table_expression>)应用…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全家桶1年46,售后保障稳定

apply有两种形式: cross apply 和 outer apply

先看看语法:

  <left_table_expression>  {cross|outer} apply <right_table_expression>

再让我们了解一下apply运算涉及的两个步骤:

  1. A1:把右表表达式(<right_table_expression>)应用到左表(<left_table_expression>)输入的行;
  2. 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]

Jetbrains全家桶1年46,售后保障稳定

复制代码

复制代码

 

向表一插入数据:

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

结果如图:

sqlserver中cross apply与outer apply用法

再建表二([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

结果如图:

sqlserver中cross apply与outer apply用法

例子:题目:得到每个消费者最新的两个订单:

用cross apply

sql:

复制代码

复制代码

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

复制代码

复制代码

结果如图:

sqlserver中cross apply与outer apply用法

过程分析:

  它是先得出左表【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

复制代码

复制代码

结果如图:

sqlserver中cross apply与outer apply用法

结果分析:

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

 

 

回到目录

Sql学习第四天——SQL 关于with cube ,with rollup 和 grouping

关于with cube ,with rollup 和 grouping

通过查看sql 2005的帮助文档找到了CUBE 和 ROLLUP 之间的具体区别

  1. CUBE 生成的结果集显示了所选列中值的所有组合的聚合。
  2. ROLLUP 生成的结果集显示了所选列中值的某一层次结构的聚合。

再看看对grouping的解释:

  当行由 CUBE 或 ROLLUP 运算符添加时,该函数将导致附加列的输出值为 1;当行不由 CUBE 或 ROLLUP 运算符添加时,该函数将导致附加列的输出值为 0。

仅在与包含 CUBE 或 ROLLUP 运算符的 GROUP BY 子句相关联的选择列表中才允许分组。

当看到以上的解释肯定非常的模糊,不知所云和不知道该怎样用,下面通过实例操作来体验一下:

先建表(dbo.PeopleInfo):

复制代码

复制代码

CREATE TABLE [dbo].[PeopleInfo](
    [id] [int] IDENTITY(1,1) NOT NULL,
    [name] [nchar](10) COLLATE Chinese_PRC_CI_AS NULL,
    [numb] [nchar](10) COLLATE Chinese_PRC_CI_AS NOT NULL,
    [phone] [nchar](10) COLLATE Chinese_PRC_CI_AS NULL,
    [FenShu] [int] NULL
) ON [PRIMARY]

复制代码

复制代码

向表插入数据:

复制代码

insert into peopleinfo([name],numb,phone,fenshu) values ('李欢','3223','1365255',80)
insert into peopleinfo([name],numb,phone,fenshu) values ('李欢','322123','1',90)
insert into peopleinfo([name],numb,phone,fenshu) values ('李名','3213112352','13152',56)
insert into peopleinfo([name],numb,phone,fenshu) values ('李名','32132312','13342563',60)
insert into peopleinfo([name],numb,phone,fenshu) values ('王华','3223','1365255',80)

复制代码

查询出插入的全部数据:

select * from dbo.PeopleInfo

结果如图:

sqlserver中cross apply与outer apply用法

操作一:先试试:1, 查询所有数据;2,用group by 查询所有数据;3,用with cube。这三种情况的比较

SQL语句如下:

复制代码

select * from dbo.PeopleInfo                                                        --1, 查询所有数据;

select [name],numb,sum(fenshu) from dbo.PeopleInfo group by [name],numb             --2,用group by 查询所有数据;

select [name],numb,sum(fenshu) from dbo.PeopleInfo group by [name],numb with cube   --3,用with cube。这三种情况的比较

复制代码

结果如图:

sqlserver中cross apply与outer apply用法

结果分析:

  用第三种(用with cube)为什么会多出来有null的字段值呢?通过分析图上的值得组合会发现是怎么回事儿了,以第三条数据(李欢,null,170)为例:它只是把姓名是【李欢】的分为了一组,而没有考虑【numb】,所以有多出来了第三条数据,也说明了170是怎么来的。其他的也是这样。再回顾一下帮助文档的解释:CUBE 生成的结果集显示了所选列中值的所有组合的聚合, 发现明了了许多。

操作二:1,用with cube;2,用with rollup 这两种情况的比较

SQL语句如下:

select [name],numb,sum(fenshu) from dbo.PeopleInfo group by [name],numb with cube    --用with cube。

select [name],numb,sum(fenshu) from dbo.PeopleInfo group by [name],numb with rollup  --用with rollup。

结果如图:

sqlserver中cross apply与outer apply用法

结果分析:

  为什么with cube 比 with rollup多出来一部分呢?原来它没有显示,以【numb】分组而不考虑【name】的数据情况。再回顾一下帮助文档的解释:ROLLUP 生成的结果集显示了所选列中值的某一层次结构的聚合,那这个【某一层次】又是以什么为标准的呢?我的猜想是:距离group up最近的字段必须考虑在分组内。

证明猜想实例:

操作:用两个group up 交换字段位置的sql语句和一个在group up 后面增加一个字段的sql语句进行比较:

SQL语句如下:

 

复制代码

select [name],numb from dbo.PeopleInfo group by [name],numb with rollup

select [name],numb from dbo.PeopleInfo group by numb,[name] with rollup

select [name],numb,phone from dbo.PeopleInfo group by [name],numb,phone with rollup

复制代码

 

结果如图:

sqlserver中cross apply与outer apply用法sqlserver中cross apply与outer apply用法

通过结果图的比较发现猜想是正确的。

—————————————————grouping————————————————-

现在来看看grouping的实例:

SQL语句看看与with rollup的结合(与with cube的结合是一样的):

select [name],numb,grouping(numb) from dbo.PeopleInfo group by [name],numb with rollup

结果如图:

sqlserver中cross apply与outer apply用法

结果分析:

  结合帮助文档的解释:当行由 CUBE 或 ROLLUP 运算符添加时,该函数将导致附加列的输出值为 1;当行不由 CUBE 或 ROLLUP 运算符添加时,该函数将导致附加列的输出值为 0。  很容易理解再此就不多解释了。

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/234627.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • FreeWebHostingArea_skyscraperpage

    FreeWebHostingArea_skyscraperpagehttp://www.cnblogs.com/skyme/archive/2011/10/26/2223984.html

    2022年9月30日
    3
  • getchar用法[通俗易懂]

    getchar用法[通俗易懂]getchar用法1.从缓冲区读走一个字符,相当于清除缓冲区 2.前面的scanf()在读取输入时会在缓冲区中留下一个字符’\n’(输入完s[i]的值后按回车键所致),所以如果不在此加一个getchar()把这个回车符取走的话,gets()就不会等待从键盘键入字符,而是会直接取走这个“无用的”回车符,从而导致读取有误 3. getchar()是在输入缓冲区顺序读入一个字符(包括空…

    2022年10月19日
    2
  • 怎么判断摄像头开没开_qt获取控制台输出并显示

    怎么判断摄像头开没开_qt获取控制台输出并显示一、系统环境介绍PC环境:ubuntu18.04Android版本:8.1Android设备:友善之臂RK3399开发板摄像头:罗技USB摄像头FFMPEG版本:4.2.2NDK版本:R19CQT版本:5.12二、QT代码关于FFMPEG库的编译、QT的环境搭建等问题,可以看上篇文章。直接上核心代码:#include”main…

    2025年12月7日
    6
  • CSS设置超链接样式常用

    CSS设置超链接样式常用伪类名称 含义 示例 a:link 未单击访问时超链接样式 a:link{color:#9ef5f9;} a:visited 单击访问后超链接样式 a:visited{color:#333;} a:hover 鼠标悬浮其上的超链接样式 a:hover{color:#…

    2022年7月19日
    13
  • 数据库服务器修改地址,数据库服务器修改地址

    数据库服务器修改地址,数据库服务器修改地址

    2021年11月28日
    45
  • 5.25 使用半调图案命令制作影印效果 [Illustrator CC教程][通俗易懂]

    5.25 使用半调图案命令制作影印效果 [Illustrator CC教程][通俗易懂]原文:http://coolketang.com/staticDesign/5a97b8c4128fe1189bd33ddc.html1.本节课将为您演示[半调图案]命令的使用。首先选择文档中,待编辑的图像。 2.接着依次点击[效果&gt;效果画廊]命令。 3. 4.在弹出的效果画廊窗口中,点击[缩小]按钮,在预览区缩小显示当前的图像。 5.点击[素描]左侧的三角形,显示[素描]效果组…

    2025年9月2日
    4

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号