本人在開發一個小項目——“學生畢業設計管理”,其中有學生選題模組,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
然後再建立一個視圖:
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
即可得到3的結果。
以上是俺的做法,可能不是最好,希望拋磚引玉,或對同仁有啟發作用。