现在有两个表学生(sid,名称)和课程(cid,名称),这种关系是多对多的。因此,还有另一个表 student_course(sid,cid),用于存储有关由谁选择的课程的信息。
如何编写可以获得所有学生选择的课程的SQL?
答案 0 :(得分:2)
标准解决方案:使用NOT EXISTS ( ... NOT EXISTS (...))
构造:
SELECT * FROM course c
WHERE NOT EXISTS (
SELECT * from student s
WHERE NOT EXISTS (
SELECT * from student_course cs
WHERE cs.sid = s.sid
AND cs.cid = c.cid
)
)
;
此查询通常比count() == count()
变体更快(给定适当的索引)。原因是:您不必计算所有(不同)记录;一旦您找到一个学生不参加此课程,您可以从列表中省略此课程嫌犯。另外:反连接通常可以使用索引[所以可以使用count(),但仍需要计算所有索引中的(不同)键值]
答案 1 :(得分:1)
Select c.cid, c.name
From course c where
(select count(1) from student) = (select count(1) from student_course sc where sc.cid = c.cid);
它会找到student_course表中该课程的参赛人数与学生人数相匹配的所有课程
CID NAME
1 Test Course1
4 Test Course4