SQL_CROSS APPLY 和 OUTER APPLY

SQL Server 2005 新增 cross apply 和 outer apply 联接语句

主要用途是:增加 cross apply 和 outer apply 是用于交叉联接表值函数(返回表结果集的函数)的, 更重要的是这个函数的参数是另一个表中的字段。

先举个简单的例子来理解两者的使用方式及原理:

————. cross apply————
select *
  
from TABLE_1 T1
cross apply FN_TableValue(T1.column_a)

————. outer apply————
select *
  
from TABLE_1 T1
outer apply FN_TableValue(T1.column_a)


cross apply 和 outer apply 对于 T1 中的每一行都和派生表(表值函数根据T1当前行数据生成的动态结果集) 做了一个交叉联接。cross apply 和 outer apply 的区别在于: 如果根据 T1 的某行数据生成的派生表为空,cross apply 后的结果集 就不包含 T1 中的这行数据,而 outer apply 仍会包含这行数据,并且派生表的所有字段值都为 NULL。 

step1:首先模拟两张表,第二张表作为表值函数返回的表:

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)
step2:#T中的每一行与#T2 所有行进行交叉连接

select * from #T 
cross apply #T2 
---------------------------------------
select * from #T 
outer apply #T2 
返回的结果均为:(因为#T2不为空表)



step3:看一下两者之间的区别

select * from #T t
cross apply (select * from #T2  t2
where t2.姓名=t.姓名) a
---------------------------------------------
select * from #T t
outer apply (select * from #T2  t2
where t2.姓名=t.姓名) a

cross apply 结果如下:


outer apply 结果如下:(派生表为空也会返回前面一张表的数据)


来个正真的实例:被符号分割字符串转化成多行并放到表中存储函数

create function [dbo].[func_splitstring]
(@str nvarchar(max),@split varchar(10))
returns @t Table (c1 varchar(100))
as
begin
    declare @i int
    declare @s int
    set @i=1
    set @s=1
    while(@i>0)
    begin    
        set @i=charindex(@split,@str,@s)
        if(@i>0)
        begin
            insert @t(c1) values(substring(@str,@s,@i-@s))
        end   
        else begin
            insert @t(c1) values(substring(@str,@s,len(@str)-@s+1))
        end
        set @s = @i + 1   
    end
    return
end

该字符串分割的函数,传入参数是一个字符串以及分隔符,返回的是一张表。传入的字符串又是一张表中的一个数据项。非常适合使用 outer apply 和cross apply

这里有一张待操作的表

想要把第二个字段中有分隔符的数据项拆分,而存放在原表中


SELECT  FormalTerm ,f.c1 as Alias FROM [SooilSemanticsDB_ImportData].[dbo].[DR_BO Well] t
outer apply func_splitstring (t.Alias,',') f


结果如下:

非常好用哦,以后有这样的需求就可以用了哦





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值