用到了两个表teacher和studentstudent的字段和值如下:
id name schoolId
1 张三 1
2 李四 1
3 王五 2
4 宋六 1
5 郑七 2teacher的字段和值如下:
id name studentId
1 王老师 3,5,11
2 李老师 1,3
3 余老师 2,5,6,7
4 张老师 3,4
我要的查询结果是,提供一个学生的id,然后查出teacher表中studentId字段里包含了该id值的所有行。
比如我要查出学生id包含有3的所有老师,即王老师,李老师和张老师。
我试图用 where like 这样的模糊查询,但结果有误,比如给定学生id为1时,会把11的值也查出来。
帮帮忙,谢谢!

解决方案 »

  1.   

    拆出来,链接一下student表即可。code=sql]--if object_id('[TB]') is not null drop table [TB]
    --go
    --create table [TB] (id int,name nvarchar(6),studentId VARCHAR(20))
    --insert into [TB]
    --select 1,'王老师','3,5,11' union all
    --select 2,'李老师','1,3' union all
    --select 3,'余老师','2,5,6,7' union all
    --select 4,'张老师','3,4'--select * from [TB];with TT as 
    (select id,name,studentId=cast(left(studentId,charindex(',',studentId+',')-1) as nvarchar(100)),Split=cast(stuff(studentId+',',1,charindex(',',studentId+','),'') as nvarchar(100)) from TB
    union all
    select id,name,studentId=cast(left(Split,charindex(',',Split)-1) as nvarchar(100)),Split= cast(stuff(Split,1,charindex(',',Split),'') as nvarchar(100)) from TT where split>''
    )
    select id,name,studentId from TT order by id,name option (MAXRECURSION 0)
    /*
    id name studentId
    1 王老师 3
    1 王老师 5
    1 王老师 11
    2 李老师 1
    2 李老师 3
    3 余老师 2
    3 余老师 5
    3 余老师 6
    3 余老师 7
    4 张老师 3
    4 张老师 4*/[/code]
      

  2.   


    if object_id('[TB]') is not null drop table [TB]
    go
    create table [TB] (id int,name nvarchar(6),studentId VARCHAR(20))
    insert into [TB]
    select 1,'王老师','3,5,11' union all
    select 2,'李老师','1,3' union all
    select 3,'余老师','2,5,6,7' union all
    select 4,'张老师','3,4'select * from [TB];with TT as 
    (select id,name,studentId=cast(left(studentId,charindex(',',studentId+',')-1) as nvarchar(100)),Split=cast(stuff(studentId+',',1,charindex(',',studentId+','),'') as nvarchar(100)) from TB
    union all
    select id,name,studentId=cast(left(Split,charindex(',',Split)-1) as nvarchar(100)),Split= cast(stuff(Split,1,charindex(',',Split),'') as nvarchar(100)) from TT where split>''
    )
    select id,name,studentId from TT order by id,name option (MAXRECURSION 0)
    /*
    id name studentId
    1 王老师 3
    1 王老师 5
    1 王老师 11
    2 李老师 1
    2 李老师 3
    3 余老师 2
    3 余老师 5
    3 余老师 6
    3 余老师 7
    4 张老师 3
    4 张老师 4*/
      

  3.   

    select * from teacher where charindex('3',studentId,0)>0
      

  4.   

    select name from teacher where charindex(','+'3'+',',','+studentId+',')>0