首页 > 数据库 >SQL Server Cross Join、Cross Apply和Outer Apply

SQL Server Cross Join、Cross Apply和Outer Apply

时间:2023-04-20 18:35:56浏览次数:77  
标签:Join Cross tableB tableA Apply id select

先简单了解下cross apply的语法以及会产生什么样的结果集吧!

示例表:

SELECT * FROM tableA CROSS APPLY tableB
两张表直接连接,不需要任何的关联条件,产生的结果就是这两张表的笛卡儿集,在这里和上一篇帖子讲的cross join交叉连接的结果集是一样的

相当于:select * from tableA,tableB

与之对应的还有Out Apply,下面讲解一下Cross Apply 和 Outer Apply 的区别:

首先是Cross Apply:

SELECT * FROM tableA a CROSS APPLY (select * from tableB where id=a.id) b

这个结果集和 select * from tableA a inner join tableB b on a.id=b.id 一模一样,这就相当于inner join 的连接查询嘛!当然,你也可以这样写:

SELECT * FROM tableA a CROSS APPLY tableB b
WHERE a.id=b.id
结果集一模一样无差别!

其次是Outer Apply:

SELECT * FROM tableA a OUTER APPLY (select * from tableB where id=a.id) b

发现了吧!这个结果集和left join连接查询产生的结果集一模一样~

同时,发现Cross Apply 和 Cross JOin 的区别了没?

Cross Apply 可以在关联表子查询中用前一个关联表的字段的值,而Cross Join 却不行,比如这样写:SELECT * FROM tableA a CROSS JOIN (select * from tableB where id=a.id) b,语法上就不能通过!
因此Cross Join 很鸡肋,既然有Cross Apply了,那么Cross Join几乎毫无存在的价值~

针对这一点,下面列举一些Cross Apply特有的用法:

1.结合表值函数使用:

有一张表是这样的:

很简单的一张表,就一个字段num,我想把这个字段的int型数字分别转化成二进制八进制和十六进制的数值,有现成的进制转化的表值函数,我前面关于函数的讲解有写过这个函数的例子:点击打开链接

SELECT * FROM #T a CROSS APPLY [dbo].F_TConversion

实现这个结果集用CROSS APPLY,只要一句就能实现,如果换成其他的方法的话应该没这么简单哈~

总结一下:

如果查询结果集需要用到表值函数对某个字段的值进行处理的话,请使用CROSS APPLY~

2.top子查询的用法:

有一张学生表,分别name,学科,分数 这三个字段,如下:

我要看语文第一名,数学前两名,英语前三名的name,学科,分数,用cross apply实现方法如下:

SELECT b.* FROM (
select Subject='Chiness',num=1 union all
select 'Math',2 union all
select 'English',3
)a cross apply (select top(a.num) * from Students where Subject=a.Subject )b



————————————————
原文链接:https://blog.csdn.net/wikey_zhang/article/details/77480118
原文链接:https://www.cnblogs.com/cnsend/p/15526479.html

标签:Join,Cross,tableB,tableA,Apply,id,select
From: https://www.cnblogs.com/Nine4Cool/p/17337849.html

相关文章

  • MacBook,是选择crossover,还是虚拟机?
    不少Mac用户为了在Mac系统上运行exe文件而选择了crossover这款软件。但是仍然有部分用户在crossover和虚拟机之间纠结,不知道选择哪个。那么crossover好还是虚拟机好呢?crossover还是虚拟机?CrossOver是一款系统兼容软件,能够实现不用重启系统,不用购买Windows版权就可以在Mac和Linux上......
  • kubectl apply -f --record 是否将当前创建对象创建命令保存到Annotation注解中中。
    kubectlcreate-ftomcat-app1.yaml--save-config--recordkubectlapply-ftomcat-app1.yaml--record#推荐命令 --record  #是否将当前对象创建命令保存至Annotation中,布尔型数据(true或false) --save-config  #是否将当前对象配置信息保存至......
  • 第五篇——通达信指标公式编写常用函数(一)——REF、MA、EMA、CROSS(从零起步编写通达信
    内容提要:本文主要介绍了编写通达信指标公式常用的函数REF、MA、EMA、CROSS以及这些函数的综合运用举例。 通达信的函数非常多,想全部熟练掌握,几乎是不可能的,而且没有必要,毕竟很多函数很少用到。 编写通达信指标公式常用的函数大概也就三四十个,对于这些函数,建议认真学习......
  • GROUP BY+join获取全部数据
     参考链接:groupby聚合分组后如何获取分组数据_group分组后返回全部数据_自己收藏学习的博客-CSDN博客SELECTr.device_id,GROUP_CONCAT(r.user_idSEPARATOR';')user_idfromrelatedasrJOINdevicesasdond.id=r.device_id#whered.group_id=1GROUPBYr.device......
  • mysql——关于join的一些知识
    1、select*fromajoinb,与select*froma,b结果是相同的,都是两张表的笛卡尔积 2、jion、innerjoin和crossjoin在innerjoin没有加on条件时,join、innerjoin和crossjoin没有区别xxx joinxxx,就等于xxxinnerjoinxxx,也等于 xxxcrossjoinxxx,得到的结果都是两......
  • Java中线程的常用操作-后台线程、自定义线程工厂ThreadFactpry、join加入一个线程、线
    场景Java中Thread类的常用API以及使用示例:https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/126596884上面讲了Thread的常用API,下面记录下线程的一些常用操作。注:博客:https://blog.csdn.net/badao_liumang_qizhi实现后台线程后台线程,是指运行时在后台提供的一......
  • inner join查询出现两个相同的列
    使用GROUPBY语句可以使用GROUPBY语句将结果集按照指定的列进行分组,并对每个分组进行聚合操作。在使用GROUPBY语句时,需要将SELECT语句中选择的列和聚合函数中的列全部包含在GROUPBY子句中。SELECTlog_id,log_user_name,user_role,log_dateFROM`back_use......
  • mysql left join 查询时主表为null统计count为0的解决方法(join后面加group by)
     如果没有加groupby则会出UserCount为0外其它都是nullselecta.*,count(b.ID)asUserCountfromerp_roleasaleftjoinerp_userasbona.ID=b.RoleIdwhere1=1anda.TenantID=2anda.RoleName='string' 加上groupby一切正常selecta.*,count(b.ID)as......
  • Lecture#11 Joins Algorithms
    1Joins在关系型数据库中,我们常常通过规范化(Normalization)设计避免信息冗余;因此查询时,就需要通过Join将不同table中的数据合并来重建数据。本课关注双表的内等值连接。原则上我们希望,连接时将小表放到左侧(作为外表)。首先要讨论的是:Join的输出和成本分析。1.1Oper......
  • map和applymap及apply的区别
    map和applymap及apply的区别1.数据importpandasaspdimportnumpyasnpframe=pd.DataFrame(np.random.rand(4,3),columns=list('abc'),index=['Utah','Ohio','Texas','Oregon'])print(frame)#输出如下:#......