举个例子(仅仅举例子而已):学生表student里有两个字段:id(学生编号),courses(课程编号集合)有一条数据:
id(学生编号)  courses(课程编号集合)
1            0,1  课程表course里有两个字段:id(课程编号),name(课程名称)有两条数据:
id(课程编号),name(课程名称)
0             英语
1             数学如何通过sql语句来获得该学生的课程名称?通过C#语句实现比较简单。也就是获得这样的结果:
学生编号   课程编号   课程名称
1         0         英语
1         1         数学  

解决方案 »

  1.   

    create proc GetCuourse(@studentid int)
    AS
    BEGIN
    declare @courses varchar(1000)
    declare @sql nvarchar(1000)
    select @courses = courses  from student where id = @studentid
    if courses  is not null
    begin
        set @sql = 'select name from course where id in('+@courses+')'
        execute(@sql)
    end
    END 没有测试,仅作参考
      

  2.   

    用存储过程实现,参数是学生编号(@XID)CREATE PROCEDURE getcourse
    @XID int
    AS
     select  @XID as studentid,id,name from course where id in (select courses form student where id=@XID)
    GO
      

  3.   

    查询distinct id值,用游标对每个id值
    分割函数
    create   function   f_split(@c   varchar(2000),@split   varchar(2))  
      returns   @t   table(col   varchar(20))  
      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  
    select   *   from   dbo.f_split(select courses from student where id=@id,',')  
    根据分割出来的课程编号查询课程名称
      

  4.   

    为什么设计成这样:
    id(学生编号)  courses(课程编号集合) 
    1            0,1  关系表应该是这样的
    id(学生编号)  courses(课程编号集合) 
    1            0  
    1            1表明1学生有两门课
      

  5.   


    declare @student table (id int,courses varchar(20))
    insert into @student
    select 1,'0,1'
    SELECT id AS 学生编号,courses as 课程编号 FROM @student
    declare @courses table (id int,coursesname varchar(4))
    insert into @courses
    select 0,'英语' union all
    select 1,'数学' union all
    SELECT 2,'语文'
    select id as 课程编号,coursesname as 课程名称 from @coursesdeclare @param int
    set @param=1;--应该是从外面传进来的学生iddeclare @my varchar(200)
    select @my=courses from @student where id=@param
    select @param as 学生编号,id as 课程编号,coursesname as 课程名称 from @courses where id in (
    select col from  f_split(@my,','))
      

  6.   


    create function [dbo].[f_split](@c varchar(2000),@split varchar(2))   
      returns @t table(col varchar(200))   
      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  
      

  7.   

    谢谢大家了~尤其是maco_wang 
      

  8.   

    这个while(charindex(@split,@c) <>0)  是什么意思啊,找到了不就是该大于等于0吗?怎么还出了个不等于零呢
      

  9.   


    CREATE PROCEDURE getcourse
    @XID int
    AS
     select  @XID as studentid,id,name from course where id in (select courses form student where id=@XID)
    GO
    这条是对的。数据库设计没有不科学。最好在学生表的Course字段中使用回车键,形成一个列表,你在做前台开发的时候会有用的。