mssql sqlserver 使用APPLY运算符简介


摘要:
下文讲述sqlserver中APPLY关键字的用法,如下所示:
实验环境:sql server 2008 R2



APPLY关键字简介

APPLy关键字是sqlserver 2005中开始提供的一个系统关键字,即需使用此关键字需使数据库兼容模式为90
APPLY的功能同联接非常类似,APPLY运算分左右两个部分,左表达式的每一行都和右表达式进行一次计算,即右表达式需要根据左表达式提供的值进行相关计算来获取相关结果,然后返回给客户端。
APPLY的右表达式:为一个子查询或表值函数。

APPLY运算符同联接的区别:
联接:先对左右两张表进行笛卡尔乘积运算
APPLY:先进行左表达式获取,然后根据左表达式的值依次对右表达式的值进行相关获取。



APPLY常见的形式

APPLY有两种方式:
CROSS APPLY 和OUTER APPLY。
CROSS APPLY:内部联接,返回右表达式存在结果集的行。
OUTER APPLY:左外联接,返回左表达式所有行,(无论右表达式是否生成结果)
例:

   /*建表并插入数据*/
create table A (keyId1 int,info1 varchar(10))
create table B (keyId2 int,info2 varchar(10))
go
insert into A values(1,'a'),(2,'b')
insert into B values(10,'a-a'),(20,'b-b'),(30,'c-c')
go
/*cross join连接两张表 得到的行数为A表行*/
select * from A cross join B  
go
/* full join 连接如果输入 条件1=1返回结果同cross join一致*/
select * from A full join B  on  1=1 
go
truncate table A;drop table A;
truncate table B;drop table B; 

go

/*创建表 并插入数据*/
create table A (keyId1 int,info1 varchar(10))
create table B (keyId2 int,info2 varchar(10))
go
insert into A values(1,'a'),(2,'b')
insert into B values(10,'a-a'),(20,'b-b'),(30,'c-c'),(null,null)
go

/*创建表值函数*/
create function fn_bkTb(@keyIdP int)
returns @t table(keyId int ,info varchar(10))
as
begin

if @keyIdP =1
begin
return 
end

if @keyIdP =0 
begin
insert into @t values(null,null)
end
else
begin
insert into @t select keyId2  ,info2 from B 
end 
return;
end
go
/*cross apply  outer apply 可以将表1中的列作为表值函数的参数 然后再做笛卡尔积连接*/
select * from A cross apply dbo.fn_bkTb(A.keyId1) as t 
go 
select * from A outer apply dbo.fn_bkTb(A.keyId1) as t 
go 
select * from A cross join  dbo.fn_bkTb(0) as t 
go 

truncate table A;drop table A;
truncate table B;drop table B; 
drop function fn_bkTb;