首页 > 解决方案 > 查询与多个值有关系的记录

问题描述

如何查询与所有给定学生参加同一课程的所有学生?

[表:学生]
标识名称
--- --------
1个S1
2 S2
3 S3
4 S4
5 S5

[表:课程]
标识名称
--- --------
1个CA
2 CB
3 抄送

[表:SC]
学生 ID 课程 ID
--------- ---------
1 1
2 1
3 1
4 1
1 2
2 2
5 2
1 3
3 3

我想知道谁在 S1 和 S2 的同一课程中,在上面给出的数据中,结果应该是 S3、S4 和 S5,因为:

   S3,S4:参加CA,S1&S2都有
   S5:参加CB,同时有S1&S2

我尝试使用 GROUP-BY-HAVING 进行查询,但看起来很难看:

SELECT *
FROM [Students]
WHERE [Id] IN
(
    SELECT [StudentId]
    FROM [SC]
    WHERE [CourseId] IN
    (
        SELECT [CourseId]
        FROM [SC]
        WHERE [StudentId] IN 
        (
            SELECT [Id] 
            FROM [Students]
            WHERE [Name] IN ('S1', 'S2') 
        )
        GROUP BY [CourseId]
        HAVING COUNT(1)=2
    )
)
AND [Name] NOT IN ('S1', 'S2') 

有更好的办法吗?谢谢。

标签: sqlsql-server-2008many-to-many

解决方案


稍微简化。基本原理和你的一样。发现和使用Course_S1S2exists

select  s.Name, sc.CourseId
from    SC sc
        inner join Students s   on  sc.StudentId    = s.Id
where   exists  
        (
            select  x.CourseId
            from    SC x
                    inner join Students y   on  x.StudentId = y.Id
            where   y.Name  in ('S1', 'S2')
            and     x.CourseId  = sc.CourseId
            group by x.CourseId
            having count(*) = 2
        )
and     s.Name  not in ('S1', 'S2')
order by s.Name

推荐阅读