问题背景如下:
有两张表
table1
ID | 姓名 |
1 | 张三 |
2 | 李四 |
3 | 王五 |
table2
ID | 爱好 |
1 | 篮球 |
2 | 足球 |
3 | 排球 |
table3
ID | 姓名ID | 爱好ID |
1 | 1 | 1 |
2 | 1 | 2 |
3 | 2 | 1 |
4 | 2 | 3 |
5 | 3 | 2 |
6 | 3 | 3 |
现在我想创建一个视图创建成如下格式:
ID | 姓名 | 爱好 |
1 | 张三 | 篮球、足球 |
2 | 李四 | 篮球、排球 |
3 | 王五 | 足球、排球 |
视图中的“爱好” 是从table2 里爱好的部分和
这里用户和爱好是一对多的关系
在创建视图的时候,需要把一对多的语句写成“XXX,XXX”的格式
视图创建方法
CREATE VIEW [dbo].[view_test]
AS
SELECT table1.*,
GetHobby(table1.id) --GetHobby是数据库自定义的函数
from table1
GetHobby函数的定义:
CREATE FUNCTION [dbo].[GetHobby]
(
@userid int --定义输入用户的ID
)
RETURNS varchar(500) --定义输出类型
AS
BEGIN --创建方法开始
declare @habby varchar(500) --定义变量保存爱好
set @habby ='' -- 赋值
declare habby_cursor CURSOR FORWARD_ONLY FOR --建立游标,根据table3的一对多关系选取出某用户的爱好
SELECT table2.爱好
from table2,table3
where table3.姓名ID=@userid and
table3.爱好ID=table2.爱好
open habby_cursor --打开游标
declare @temp varchar(50) --定义临时变量
FETCH NEXT FROM habby_cursor INTO @temp --进入游标
while @@fetch_status <> -1 --while循环一条一条读游标
begin
select @habby =@habby +@temp+', ' --将从游标读到的信息拼装
FETCH NEXT FROM habby_cursor INTO @temp --进入下一条
end
CLOSE habby_cursor --关闭游标
DEALLOCATE habby_cursor --释放游标
select @habby =substring(@habby ,0,len(@habby )) --去除最后一个逗号
-- Return the result of the function
RETURN @habby
END
视图创建好了之后
select * from view_test
就可以取出我想取的数据了