加入收藏 | 设为首页 | 会员中心 | 我要投稿 云计算网_宿迁站长网 (https://www.0527zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

SQL2005学习笔记 APPLY 运算符

发布时间:2023-01-06 14:33:05 所属栏目:MsSql教程 来源:转载
导读: 使用apply运算符可以为实现查询操作的外部表表达式返回的每个行调用表值函数。
表值函数作为右输入,外部表表达式作为左输入。
通过对右输入求值来获得左输入每一行的计算结果,生成的行被

使用apply运算符可以为实现查询操作的外部表表达式返回的每个行调用表值函数。

表值函数作为右输入,外部表表达式作为左输入。

通过对右输入求值来获得左输入每一行的计算结果,生成的行被组合起来作为最终输出。

apply运算符生成的列的列表是左输入中的列集,后跟右输入返回的列的列表。

apply 运算符的左操作数和右操作数都是表表达式。

这些操作数之间的主要区别是:右操作数可以使用表值函数,从左操作数获取一个列作为函数的参数之一。左操作数可以包括表值函数,但不能以来自右操作数的列作为参数。

演示一下apply 运算符的用法:

复制代码 代码如下:

--建一个表

create table mydata

(

ids int identity primary key,

data nvarchar(1000)

)

go

--插入测试数据

insert into mydata values('')

insert into mydata values('a,b,c')

insert into mydata values('q')

insert into mydata values('i,p')

go

select * from mydata

go

--查询结果

ids data

1

2 a,b,c

3 q

4 i,p

建立一个表,作用是:按逗号分解字符,分解出的每一个字符做一行数据返回

复制代码 代码如下:

create function fun_mydata(

@data as nvarchar(1000)

)

returns @tem table( id int , value nvarchar(100) )

as

begin

select @data=isnull(@data,'')

if len(@data)=0

return --字符长度为0 ,退出

declare @id as int

select @id=1

declare @end as int

select @end = charindex(',', @data)

while(@end>0)

begin

insert into @tem(id,value)

select @id,left(@data,@end-1)

select @id=@id+1

select @data=right(@data,len(@data)-@end)

select @end = charindex(',', @data)

end

if len(@data)>0

begin

insert into @tem(id,value)

select @id,@data

end

return

end

开始使用apply 运算符:

复制代码 代码如下:

select m.ids, f.*

from mydata m cross apply fun_mydata(data) f

go

--结果

ids id value

2 1 a

2 2 b

2 3 c

3 1 q

4 1 i

4 2 p

select m.ids, f.*

from mydata m outer apply fun_mydata(data) f

go

--结果

ids id value

1 null null

2 1 a

2 2 b

2 3 c

3 1 q

4 1 i

4 2 p

我们看到outer apply返回的结果行比cross apply多。

这一点有点象inner join(内部联接)和left outer join(左外部联接)之间的关系.

其实apply有两种形式:cross apply 和 outer apply。

cross apply仅返回外部表中通过表值函数生成结果集的行。

outer apply既返回生成结果集的行,也返回不生成结果集的行mssql 运算符,其中表值函数生成的列中的值为 null。

以上是sql2005的解决方案,下面我演示一下sql2000怎么解决这样的查询:

思路是:做个循环来逐个链接查询。

复制代码 代码如下:

--sql2000版本

declare @ids int

select @ids =0

declare @data nvarchar(200)

select @data=''

--定义表变量临时存放数据

declare @tem table(

ids int,

id int,

value nvarchar(100)

)

declare test_cursor cursor for

select ids, data from mydata

open test_cursor

fetch next from test_cursor

into @ids,@data

while @@fetch_status = 0

begin

insert into @tem

select @ids,id,value

from dbo.fun_mydata(@data)

fetch next from test_cursor

into @ids,@data

end

close test_cursor

deallocate test_cursor

select * from @tem

同样得到了结果,但是sql2000要利用循环,这样代码复杂,计算耗时。

让我们充分利用sql server2005新兵器:apply运算符给我们带来的简便快捷的运算方式吧.

(编辑:云计算网_宿迁站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!