如何选择多对多关系中的行?(SQL)

如何选择多对多关系中的行?(SQL),sql,join,many-to-many,Sql,Join,Many To Many,我有一张学生桌和一张课程桌。 它们之间存在多对多关系,而StudentCourses表是中介。 现在,我有一个课程ID列表,并希望选择遵循列表中所有课程的学生。 怎么做 在本例中,我只希望结果是John和Jane,因为他们在我的课程列表中都有这两门课程。 我不要唐纳德,因为他只有一个 我曾经尝试过这种连接、构造,但它并没有消除只有我想要的一些课程的学生 SELECT * FROM @CourseList CRL INNER JOIN #Courses CRS ON

我有一张学生桌和一张课程桌。 它们之间存在多对多关系,而StudentCourses表是中介。 现在,我有一个课程ID列表,并希望选择遵循列表中所有课程的学生。 怎么做

在本例中,我只希望结果是John和Jane,因为他们在我的课程列表中都有这两门课程。 我不要唐纳德,因为他只有一个

我曾经尝试过这种连接、构造,但它并没有消除只有我想要的一些课程的学生

SELECT 
    * 
FROM 
    @CourseList CRL
    INNER JOIN #Courses CRS ON CRS.ID = CRL.CourseID
    INNER JOIN #StudentCourses STC ON STC.CourseID = CRS.ID
    INNER JOIN #Students STD ON STD.ID = STC.StudentID

如果您想让学生学习所有必修课程,可以使用聚合和
having

SELECT sc.StudentId 
FROM #StudentCourses sc JOIN
    @CourseList cl
    ON sc.CourseID = cl.id
GROUP BY sc.StudentId
HAVING COUNT(DISTINCT sc.CourseId) = (SELECT COUNT(*) FROM @DcourseList);
如果需要有关学生的其他信息,可以加入
students
表(或使用
中的
或类似结构)


请注意,这只需要
StudentCourses
表。它有匹配的ID。无需加入参考表。

如果您想让学生学习所有必修课程,您可以使用聚合和
have

SELECT sc.StudentId 
FROM #StudentCourses sc JOIN
    @CourseList cl
    ON sc.CourseID = cl.id
GROUP BY sc.StudentId
HAVING COUNT(DISTINCT sc.CourseId) = (SELECT COUNT(*) FROM @DcourseList);
如果需要有关学生的其他信息,可以加入
students
表(或使用
中的
或类似结构)


请注意,这只需要
StudentCourses
表。它有匹配的ID。无需加入参考表。

加入。使用WHERE子句仅选择所需的课程ID。使其更容易并尽可能帮助您:。您可以链接
JOIN
s以使用多个链接表,而无需知道查询的约束条件。表的含义——行在表中以列值表示的含义——是必要和充分的。PS“与所有人相关”或“与每个人相关”涉及“关系划分”。PS你有一个典型的歧义——如果没有课,你想要所有的学生还是一个都不要?PS在给出业务关系(ship)/关联或表(基本或查询结果)时,请说明其中的一行根据其列值对业务状况的说明。这是常见问题解答。在考虑发帖之前,请始终用谷歌搜索你的错误消息或你的问题/问题/目标的许多清晰、简洁和准确的措辞,有/没有你的特定字符串/名称和网站:stackoverflow.com和标签,并阅读许多答案。如果你发布一个问题,用一句话作为标题。查看文本上方的投票箭头鼠标(&T)。进行连接。使用WHERE子句仅选择所需的课程ID。使其更容易并尽可能帮助您:。您可以链接
JOIN
s以使用多个链接表,而无需知道查询的约束条件。表的含义——行在表中以列值表示的含义——是必要和充分的。PS“与所有人相关”或“与每个人相关”涉及“关系划分”。PS你有一个典型的歧义——如果没有课,你想要所有的学生还是一个都不要?PS在给出业务关系(ship)/关联或表(基本或查询结果)时,请说明其中的一行根据其列值对业务状况的说明。这是常见问题解答。在考虑发帖之前,请始终用谷歌搜索你的错误消息或你的问题/问题/目标的许多清晰、简洁和准确的措辞,有/没有你的特定字符串/名称和网站:stackoverflow.com和标签,并阅读许多答案。如果你发布一个问题,用一句话作为标题。请参见文本上方的投票箭头(&S)。