本人在开发一个小项目——“学生毕业设计管理”,其中有学生选题模块,如图1所示,我要求的功能是当鼠标放置到题目上时动态显示该题目的相关信息,如“课题简介”、“选题要求”、“允许选题人数”、“已选人数”等信息比较好处理,关键是“已选该题的学生名单”。
图1
思路1:设计一个已选该题学生名单字段(nvarchar(max)),动态修正该字段内容,添加选题学生比较容易,直接拼接字符串即可,删除比较麻烦,可以使用string.Replace(string oldValue, string newValue)对字符串进行解析处理。但这样设计不符合1NF要求,并且多有不便。
思路2:设计表结构如图2所示,该设计完全符合1NF、2NF、3NF,问题是如何按照题目(title_id)汇总选该题的学生(student_no)?形成如图3效果:
图2
图3
我的做法如下:
首先写一个汇总函数:
1ALTER function [dbo].[getstr](@id int)
2
3 returns varchar(2000)
4
5 as
6
7 begin
8
9 declare @str nvarchar(2000)
10
11 set @str=''
12
13 select @str=@str+','+rtrim([student_name]) from v_teacher_student where title_id=@Id order by title_id
14
15 set @str=right(@str,len(@str)-1)
16
17 return @str
18
19 end
20
21
2
3 returns varchar(2000)
4
5 as
6
7 begin
8
9 declare @str nvarchar(2000)
10
11 set @str=''
12
13 select @str=@str+','+rtrim([student_name]) from v_teacher_student where title_id=@Id order by title_id
14
15 set @str=right(@str,len(@str)-1)
16
17 return @str
18
19 end
20
21
然后再创建一个视图:
1ALTER VIEW [dbo].[v_teacher_student_name]
2
3AS
4
5SELECT DISTINCT title_id, dbo.getstr(title_id) AS aaa
6
7FROM dbo.v_teacher_student
8
9WHERE (title IS NOT NULL)
10
2
3AS
4
5SELECT DISTINCT title_id, dbo.getstr(title_id) AS aaa
6
7FROM dbo.v_teacher_student
8
9WHERE (title IS NOT NULL)
10
即可得到如图3的结果。
以上是俺的做法,可能不是最好,希望抛砖引玉,或对同仁有启发作用。