Sql Server2005对t-sql的增强之Cross Apply
来源:互联网 发布:micro golang 编辑:程序博客网 时间:2024/06/05 07:35
Cross Apply使表可以和表值函数结果进行join,在下面的示例中建了两个表和一个表值函数,T_b的列a_ids中会存放a表的id用,分割的字符串连接;我们通过cross apply使T_a,T_b表通过splitIDs inner join 连接。请看示例:GO
name varchar(50),
)
GO
if object_id('T_b',N'U') is not null
drop table T_b
GO
create table T_b
(
id int unique not null,
name varchar(10),
a_ids varchar(100) null --要在这一列中存放t_a表的ID序列,这样做连第一范式都没有满足,但是有时候考虑性能或设计我们可能会像这么用
)
GO
--初始化数据
GO
--创建一个表值函数,用来拆分用逗号分割的数字串,返回只有一列数字的表
if object_id('splitIDs','TF') is not null
drop function splitIDs;
GO
create function splitIDs(
@Ids nvarchar(1000)
)
returns @t_id TABLE (id bigint)
as
begin
declare @i int,@j int,@l int,@v bigint;
set @i = 0;
set @j = 0;
set @l = len(@Ids);
while(@j < @l)
begin
set @j = charindex(',',@Ids,@i+1);
if(@j = 0) set @j = @l+1;
set @v = cast(SUBSTRING(@Ids,@i+1,@j-@i-1) as bigint);
INSERT INTO @t_id VALUES(@v)
set @i = @j;
end
return;
end
GO
--测试splitIDs的执行效果
if object_id('T_a','U') is not null
drop table T_a
GO
name varchar(50),
)
GO
if object_id('T_b',N'U') is not null
drop table T_b
GO
create table T_b
(
id int unique not null,
name varchar(10),
a_ids varchar(100) null --要在这一列中存放t_a表的ID序列,这样做连第一范式都没有满足,但是有时候考虑性能或设计我们可能会像这么用
)
GO
--初始化数据
INSERT INTO T_a VALUES(1,'A-1')
INSERT INTO T_a VALUES(2,'A-2')
INSERT INTO T_a VALUES(3,'A-3')
INSERT INTO T_a VALUES(4,'A-4')
INSERT INTO T_a VALUES(5,'A-5')
GO
--创建一个表值函数,用来拆分用逗号分割的数字串,返回只有一列数字的表
if object_id('splitIDs','TF') is not null
drop function splitIDs;
GO
create function splitIDs(
@Ids nvarchar(1000)
)
returns @t_id TABLE (id bigint)
as
begin
declare @i int,@j int,@l int,@v bigint;
set @i = 0;
set @j = 0;
set @l = len(@Ids);
while(@j < @l)
begin
set @j = charindex(',',@Ids,@i+1);
if(@j = 0) set @j = @l+1;
set @v = cast(SUBSTRING(@Ids,@i+1,@j-@i-1) as bigint);
INSERT INTO @t_id VALUES(@v)
set @i = @j;
end
return;
end
GO
--测试splitIDs的执行效果
select * from splitIDs('1,2,4,3')
select * from splitIDs('100')
select * from splitIDs(NULL)
GO
--使用cross apply获得t_b表中指定行对应的所有t_a表中的记录
select
aid = t_a.id
,aname = t_a.name
,bid = t_b.id
from t_b
cross apply splitIDs(a_ids) tbl_Ids
INNER JOIN t_a ON tbl_Ids .id = t_a.id
where t_b.id = 1
你明白cross apply的用法了吗?有问题欢迎讨论。
- Sql Server2005对t-sql的增强之Cross Apply
- Sql Server2005对t-sql的增强之Cross Apply
- Sql Server2005对t-sql的增强之排名函数
- Sql Server2005对t-sql的增强之排名函数 (转)
- Sql Server2005对t-sql的增强之通用表表达式CTE
- SQL Server2005 中的十个最重要的T-SQL增强功能
- SQL Server 2005 T-SQL cross Apply 与outer apply
- T-SQL Part VIII: CROSS APPLY, OUTER APPLY
- SQL Server2005 apply的一些运用
- SQL Server 2008 对 T-SQL 语言的增强
- SQL Server 2008对T-SQL语言的增强
- SQL Server 2008对T-SQL语言的增强
- SQL Server 2008 对 T-SQL 语言的增强
- SQL Server 2008 对 T-SQL 语言的增强
- SQL Server2012 T-SQL对分页的增强尝试
- SQL Server2012 T-SQL对分页的增强尝试
- 介绍SQL Server 2005的CROSS Apply
- 介绍SQL Server 2005的CROSS Apply
- Android sharedUserId研究记录
- PHP----502\504error 解决方法总结
- 数组名a+1和&a+1的区别
- Python中Lock与RLock
- Spring Batch代码块级别的重试
- Sql Server2005对t-sql的增强之Cross Apply
- Android 中Service简单理解(生命周期)
- hdoj_2553N皇后问题
- Windows平台关于Qt+QML应用文件的发布
- 优先队列(堆)C++实现源码
- STC8951单片机不断电下载的方法(亲自测试过)
- 余弦相似性的文本计算思想
- Ubuntu 中Samba的安装
- VC中获取窗口句柄的各种方法 .