cross apply和表值函数进行关联查询
来源:互联网 发布:怎么做网络兼职赚钱 编辑:程序博客网 时间:2024/06/17 05:01
目前场景是有一个兴趣爱好类型表和一个员工爱好表,员工爱好表中的爱好一列,如果这个员工有多个爱好,那么就将这些爱好放到一条记录当中,爱好之间用逗号隔开,现在需求是要将每个员工的这些爱好分隔成一条条记录查询出来,从而可以例如做员工爱好统计等应用。
爱好类型表 t_a
员工爱好表 t_b
需要的结果是
创建一个分隔字符串的表值函数
create function [dbo].[splitIDs]( @Ids nvarchar(1000), @split_char nvarchar(10))returns @t_id TABLE (id bigint)asbegin 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(@split_char,@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;endGO
采用下面的语句即可得到期望的结果
select aid = t_a.id ,aname = t_a.name ,bid = t_b.id,t_b.namefrom t_bcross apply splitIDs(a_ids,',') tbl_IdsINNER JOIN t_a ON tbl_Ids .id = t_a.id
分割字符串函数的另一种写法
USE [master]GO/****** Object: UserDefinedFunction [dbo].[Split] Script Date: 05/08/2014 14:45:25 ******/SET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOALTER FUNCTION [dbo].[Split] ( @c VARCHAR(MAX) , @split VARCHAR(50) ) RETURNS @t TABLE ( col VARCHAR(50) ) AS BEGIN WHILE ( CHARINDEX(@split, @c) <> 0 ) BEGIN INSERT @t( col ) VALUES ( SUBSTRING(@c, 1, CHARINDEX(@split, @c) - 1) ) SET @c = STUFF(@c, 1, CHARINDEX(@split, @c), '') END INSERT @t( col ) VALUES ( @c ) RETURN END-------------------------------END OF FUNCTION----------------------------------------------
使用方法
select * from Split('1,2,3',',')
0 0
- cross apply和表值函数进行关联查询
- 使用Cross Apply和Outer Apply关联表值函数中的字段
- cross apply 和 outer apply
- cross apply 和 outer apply
- Cross Apply 和 Outer Apply
- Cross apply 和outer apply
- 用于分拆字符串的表值函数--cross apply & outer apply
- SQLServer连接查询之Cross Apply和Outer Apply的区别及用法
- 關於Cross Join 和 Outer/Cross Apply
- cross apply 和 outer apply 的区别
- CROSS APPLY 和outer apply 的区别
- cross apply和outer apply的区别
- cross apply和outer apply的区别
- CROSS APPLY和 OUTER APPLY 区别详解
- CROSS APPLY和 OUTER APPLY 区别详解
- CROSS APPLY和 OUTER APPLY 区别详解
- CROSS APPLY和 OUTER APPLY 区别详解
- CROSS APPLY和 OUTER APPLY 区别详解
- XML解析_PULL
- 排序小结(C++版)
- USACO 3.1 Shaping Regions
- 排序小结(java版)
- C++命名空间
- cross apply和表值函数进行关联查询
- 阿里云服务器CentOS 5.7(64位)安装配置LAMP服务器(Apache+PHP5+MySQL)
- IOS系统CoreImage与ImageIO探究
- 搜狐焦点的互联网思想:让购房者看清楼盘本相
- frameset iframe frame之间的区别
- vc++常见数据类型所占字节空间总结(VS2008 64位系统)
- android开源项目---View篇
- PHP编程——我的第一个框架(初步设计)
- 【Paper】【Compute Vision】Best Paper Awards in Computer Science (since 1996)