现在有三个数据库表结构如下:  
   
  1、科目表(subject):  
   
          编号:SubID   char(2)   PK  
          科目名:SubName   nvarchar(10)  
   
          编号                         科目名  
          01                             语文  
          02                             数学  
          03                             英语  
          04                             物理  
          05                             历史  
          06                             地理  
          07                             计算机  
          ...                           ...  
   
  2、学生表(student)  
   
          学号:StuID   char(6)   PK  
          姓名:Name   nvarchar(10)  
          性别:Sex     bit  
          出生日期:Birthday   smalldatetime  
          ...  
   
          学号                         姓名                                 性别                         出生日期  
  ....  
          000901                     张一                                 1                                 1983-2-7  
          000902                     王二                                 0                                 1984-6-20  
          000903                     李三                                 1                                 1983-5-2  
          ...                           ...                                   ...                             ...  
  ....  
   
  3、选课表(stusubject)  
   
          编号:ID         int         自动编号         PK  
          学号:StuID         char(6)  
          选择科目编号:SubID           varchar(50)  
   
          ID                             StuID                               SubID  
          1                               000901                             02,05,07  
          2                               000902                             01,02,03,05,07  
          3                               000903                             01,02,04,05  
   
  问题:  
  1、选课表的结构是否合理?  
  2、如果需要检索出选择英语(编号:03)课程的所有学生信息,最优化查询语句该怎  
  样写?  
        我只考虑到用"select   *   from   student   where   SubID   like   '%03%'"可实现查询,但  
  性能不理想,不知道用IN能否实现?  
  3、在可修改科目表(subject)和选课表(stusubject)结构的情况下,有没有更好的方法  
  能解决上述的查询问题?  

解决方案 »

  1.   

    可以吧选课表存储数据格式改成
    id      stuid     subid
    1        000901    02
    1        000901    05
    .......
    3        000903    01
    3        000903    02 select       *       from       stusubject here       SubID ='3'
    来查或者不改 用 
    select       *       from       stusubject a where not exists (select 1 from stusubject where stuid=a.stuid and charindex(','+'03'+',',subid)=0)
      

  2.   


    --2、如果需要检索出选择英语(编号:03)课程的所有学生信息
    select b.* 
    from subject a,student b,stusubject c
    where a.SubName = '英语' and charindex(',' + a.SubID + ',' , ',' + c.subid + ',') > 0 and b.StuID = c.StuID 
      

  3.   

    --2、如果需要检索出选择英语(编号:03)课程的所有学生信息
    --如果这个查询速度不慢(也就是数据量不是非常大的话),可以不改表结构,用如下SQL即可.
    select b.* 
    from subject a,student b,stusubject c
    where a.SubName = '英语' and charindex(',' + a.SubID + ',' , ',' + c.subid + ',') > 0 and b.StuID = c.StuID 
      

  4.   

    选课表还是建议每科目一条记录好些。
    编号:ID int PK  学号:StuID char(6)  选择科目编号:SubID char(2)    
    目前这样的结构对于修改,查询,关联,都很麻烦。可操作性和扩展性都很差。