sql - 查询与多个值有关系的记录
问题描述
如何查询与所有给定学生参加同一课程的所有学生?
[表:学生] 标识名称 --- -------- 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')
有更好的办法吗?谢谢。
解决方案
稍微简化。基本原理和你的一样。发现和使用Course
_S1
S2
exists
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
推荐阅读
- excel - 如何使用 VBA Excel 在另一个书签之后创建一个书签?
- c - 是在 C 中使函数“独立”的最佳实践吗?
- python - 每次有新行时,在 Python 中从外部命令行应用程序获取文本
- asp.net - ASP.NET 重定向 URL 仅在 / 之后有某些内容时
- angular - 如何在 Angular 中为 Karma/jasmine 测试创建存根
- typescript - 如果存在另一个道具,则完全包含 Typescript 界面道具
- c# - ComboBox 设置一个值 C#
- python - 如何打开文件夹中的第一个文件
- flutter - Flutter:如何将base64转换为图像?
- android - 如何在android中使用OkHttp从web api获取json数据到RecyclerView