请教各位:(sql server2000 ,asp.net ,c#)
   设计了两张表:
tkinfo表:
zhu_id,   fu_id, title,             full_score
1           0   《计算机》            100
2           1    《数据库》           40
3           2     《基础知识》        20
4           2     《数据库开发》      20
5           3       《数据库概念》    10
6           3       《数据库高级知识》 10
......tkdetail表
id,       parentid,  title,                score,   type
1           5         什么叫数据库          2       填空
2           5         数据库分为哪些类型    2       填空 
......  我看很多人设计时,都是将科目、章节分别设计一张表,又按填写、单选等类型设计为不同的表。
我现在将tkinfo中用一张表实现科目、章节、知识点用一张表实现四层。现有需要用一个sql语句(最好是存储过程,这样效率更高)来实现得到一个如下的dataset数据集:
id    lev1,         lev2,     lev3,         lev4,       tille ,        score,   type
1     《计算机》  《数据库》 《基础知识》《数据库概念》 什么叫数据库     2      填空
....
就是从表tkdetail取数据时,要得到它的四个父级目录。请求该如何写这个sql语名(最好再附上存储过程),谢谢!

解决方案 »

  1.   

    递归方面 SQL2000用函数 ,2005以上版本用CTE
      

  2.   

    Create Table tkinfo(zhu_id Int, fu_id Int, title Nvarchar(100), full_score Int)
    go
    insert tkinfo
      Select 1 ,0 ,N'《计算机》'  ,100
    Union Select 2 ,1 ,N'《数据库》' ,40
    Union Select 3 ,2 ,N'《基础知识》'  ,20
    Union Select 4 ,2 ,N'《数据库开发》'  ,20
    Union Select 5 ,3 ,N'《数据库概念》'  ,10
    Union Select 6 ,3 ,N'《数据库高级知识》'  ,10
    Union Select 7 ,5 ,N'《数据库基础》'  ,20
    Union Select 8 ,7 ,N'《数据库基础-上册》'  ,10
    Union Select 9 ,8 ,N'《数据库高级-下册》'  ,10Create Table tkdetail(id Int, parentid Int, title Nvarchar(100), score Int, type Nvarchar(100))
    go
    insert tkdetail
      Select 1 ,5 ,N'什么叫数据库' ,2 ,N'填空'
    Union Select 2 ,8 ,N'数据库分为哪些类型' ,2 ,N'填空' 
    Union Select 3 ,9 ,N'数据库' ,3 ,N'选择' go
    Create Function f_Pid_Title(@ID Int,@place Int)
    Returns Nvarchar(1000)
    As
    Begin
    Declare @Level Int,@count Int,@title Nvarchar(1000)
    Declare @t_Level Table(zhu_id Int,Level Int,title Nvarchar(100)) Set @Level=1
    Insert @t_Level Select @ID,@Level,''
    While @@ROWCOUNT>0
    Begin
    Set @Level=@Level+1
    Insert @t_Level Select a.fu_id,@Level,a.title
    From tkinfo a,@t_Level b
    Where a.zhu_id=b.zhu_id
    AND b.Level=@Level-1
    End Select @count = Count(1) From @t_Level
    Select @title = title From @t_Level Where Abs(Level - @count) = @place
    Return @title
    End
    GO/*
    id lev1, lev2, lev3, lev4, tille , score, type
    1 《计算机》 《数据库》 《基础知识》《数据库概念》 什么叫数据库 2 填空
    */Select  id ,
    dbo.f_Pid_Title(parentid,0) lev1,
    dbo.f_Pid_Title(parentid,1) lev2,
    dbo.f_Pid_Title(parentid,2) lev3,
    dbo.f_Pid_Title(parentid,3) lev4,
    title,score,type
    From  tkdetail 
    Where  id = 1/*
    id lev1, lev2, lev3, lev4, tille , score, type
    2 《计算机》 《数据库》 《基础知识》 《数据库概念》 《数据库基础》 《数据库基础-上册》 数据库分为哪些类型 2 填空
    */Select  id ,
    dbo.f_Pid_Title(parentid,0) lev1,
    dbo.f_Pid_Title(parentid,1) lev2,
    dbo.f_Pid_Title(parentid,2) lev3,
    dbo.f_Pid_Title(parentid,3) lev4,
    dbo.f_Pid_Title(parentid,4) lev5,
    dbo.f_Pid_Title(parentid,5) lev6,
    title,score,type
    From  tkdetail 
    Where  id = 2/*
    id lev1, lev2, lev3, lev4, tille , score, type
    3 《计算机》 《数据库》 《基础知识》 《数据库概念》 《数据库基础》 《数据库基础-上册》 《数据库高级-下册》 数据库 3 选择
    */Select  id ,
    dbo.f_Pid_Title(parentid,0) lev1,
    dbo.f_Pid_Title(parentid,1) lev2,
    dbo.f_Pid_Title(parentid,2) lev3,
    dbo.f_Pid_Title(parentid,3) lev4,
    dbo.f_Pid_Title(parentid,4) lev5,
    dbo.f_Pid_Title(parentid,5) lev6,
    dbo.f_Pid_Title(parentid,6) lev7,
    title,score,type
    From  tkdetail 
    Where  id = 3Drop Table tkinfo,tkdetail
    Drop Function f_Pid_Title