cross apply 与 inner join 的区别

原创 2016年06月01日 15:30:31

下面还有一个小例子,根据小例子可以将cross apply /outer apply 分别换成inner join /left join,结果是一样的,但是cross apply之后一般是带函数.
inner join之后一般是带表.

create table #T(姓名 varchar(10))
insert into #T values('张三')
insert into #T values('李四')
insert into #T values(NULL )
 
 
create table #T2(姓名 varchar(10) , 课程 varchar(10) , 分数 int)
insert into #T2 values('张三' '语文' , 74)
insert into #T2 values('张三' '数学' , 83)
insert into #T2 values('张三' '物理' , 93)
insert into #T2 values(NULL '数学' , 50)
 
--drop table #t,#T2
go
 
select 
    
from 
    #T a
cross apply
    (select 课程,分数 from #t2 where 姓名=a.姓名) b

/*
select a.*,b.课程,b.分数
from 
    #T a
inner join#t2 b
where a.姓名=b.姓名

*/
 
/*
姓名         课程         分数
---------- ---------- -----------
张三         语文         74
张三         数学         83
张三         物理         93
 
(3 行受影响)
 
*/
 
select 
    
from 
    #T a
outer apply
    (select 课程,分数 from #t2 where 姓名=a.姓名) b

/*
select a.*,b.课程,b.分数
from 
    #T a
left join#t2 b
where a.姓名=b.姓名

*/

/*
姓名         课程         分数
---------- ---------- -----------
张三         语文         74
张三         数学         83
张三         物理         93
李四         NULL       NULL
NULL       NULL       NULL
 
(5 行受影响)

正好在查询cross apply与outer apply 区别的时候,同事看到了,然后就给了我下面的例子,解开了我之前的面试之谜。。。
(当时我用row_number,墨迹半天还觉得不对。。今天终于解决了)

选出每个source 的前100条数据!!
with b as (select distinct source from aqua_rpt.crd.crd_report_sft_derv_data) 
select * from b 
cross apply 

(select top 100 * from aqua_rpt.crd.crd_report_sft_derv_data a where b.source = a.source) a


当然也可以用下面的语句,但是由于 b表数据量很大,所以考虑到消耗内存太大,就采用 CTE.

select b.source,a.*

from aqua_rpt.crd.crd_report_sft_derv_data b

cross apply 

(select top 100 * from aqua_rpt.crd.crd_report_sft_derv_data a where b.source = a.source) a



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

SQL Server数据库操作中,在2005以上的版本新增加了一个APPLY表运算符的功能。新增的APPLY表运算符把右表表达式应用到左表表达式中的每一行。它不像JOIN那样先计算那个表表达式都可以,...

Sql Server 数据的拆分和合并 cross apply和outer apply

背景:      今天遇到了数据合并和拆分的问题,尝试了几种写法。但大致可分为两类:一、原始写法。二、Sql Server 2005之后支持的写法。第一种写法复杂而且效率低下,不推荐。所以下面具...

cross apply和表值函数进行关联查询

目前场景是有一个兴趣爱好类型表和一个员工爱好表,员工爱好表中的爱好一列,如果这个员工有多个爱好,那么就将这些爱好放到一条记录当中,爱好之间用逗号隔开,现在需求是要将每个员工的这些爱好分隔成一条条记录查...

關於Cross Join 和 Outer/Cross Apply

先為大家準備點數據: CREATETABLE TA(Acol INT); GO INSERTINTO TA SELECT 1 UNION ALL SELECT 2; GO CREATETAB...

SQL Server中以apply运算符简化join和子查询

 关系数据库中涉及多表操作会使查询变复杂。 多个表的查询,常用的操作方法就是使用表联接(join)或子查询。在sql server 2005中新增了apply运算符, 它能简化原来用join或子...

SQLServer连接查询之Cross Apply和Outer Apply的区别及用法

先简单了解下cross apply的语法以及会产生什么样的结果集吧! 示例表: SELECT * FROM tableA CROSS APPLY tableB 两张表直接连接,不需要任何的...

[MSSQL]cross join与cross apply的区别与应用

What is Cross Join in SQL? The SQL CROSS JOIN produces a result set which is the number of rows in ...

SQL Server 2005 中 Cross join & Cross Apply & Outer Apply 的区别

SQL Server 2005 中 Cross join & Cross Apply & Outer Apply 的区别 SQL Cross Apply SQL Cross join SQL Out...
  • y_h_t
  • y_h_t
  • 2011年03月21日 13:31
  • 1466

XML------XML文档类型定义(Schema结构)

XML Schema结构                                                                                        ...

cross apply和表值函数进行关联查询

目前场景是有一个兴趣爱好类型表和一个员工爱好表,员工爱好表中的爱好一列,如果这个员工有多个爱好,那么就将这些爱好放到一条记录当中,爱好之间用逗号隔开,现在需求是要将每个员工的这些爱好分隔成一条条记录查...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:cross apply 与 inner join 的区别
举报原因:
原因补充:

(最多只允许输入30个字)