如何在SQL中找到正在学习C课程的学生C的同学?
有两个表,如何在SQL中找到正在学习C课程的学生C的同学?,sql,union,Sql,Union,有两个表,学生和课程。students表中有name、age和ssn 课程有ssn和课程 现在,courses表中的ssn不是唯一的,但是students中的是主键 我需要找出参加studentC课程的学生(包括结果解决方案中的C姓名) 这是一个挑战性的问题,所以我不介意,但我想知道解决方案是什么 到目前为止,我已经尝试使用如下的联合操作符: SELECT ssn FROM courses UNION SELECT ssn FROM students WHERE name = 'c' 它只返
学生
和课程
。students
表中有name
、age
和ssn
课程
有ssn
和课程
现在,courses
表中的ssn
不是唯一的,但是students
中的是主键
我需要找出参加studentC
课程的学生(包括结果解决方案中的C
姓名)
这是一个挑战性的问题,所以我不介意,但我想知道解决方案是什么
到目前为止,我已经尝试使用如下的联合
操作符:
SELECT ssn
FROM courses
UNION SELECT ssn
FROM students
WHERE name = 'c'
它只返回表课程中的所有SSN
。这个问题要求我们有效地找到两个表的集合并集来确定解决方案
感谢您的帮助
SELECT DISTINCT s2.ssn, s2.name
FROM students s1
INNER JOIN courses c1 /* Find all courses taken by student 'c' */
ON s1.ssn = c1.ssn
INNER JOIN courses c2 /* Find all students in all of c's courses */
ON c1.course = c2.course
INNER JOIN students s2 /* Get the details for each of those students */
ON c2.ssn = s2.ssn
WHERE s1.name = 'c'
希望这有帮助
希望这能有所帮助@Mahivatekat:我在回答中添加了一个独特的选项来满足这个要求。如此独特使它独一无二。。。“s1.ssn=c1.ssn上的内部连接课程c1”和其他内容是什么意思?顺便说一下,这实际上是起作用的!有没有办法用并集运算符解决这个问题?s1、s2、c1和c2是什么?他们是化名吗?@Mahivatekat很乐意帮忙。我看不出有什么办法可以和工会合作。我当然不会那样处理这个问题。是的,s1,s2。。。是表的别名。@Mahivatekat:我在回答中添加了一个DISTINCT以满足该要求。DISTINCT使其唯一。。。“s1.ssn=c1.ssn上的内部连接课程c1”和其他内容是什么意思?顺便说一下,这实际上是起作用的!有没有办法用并集运算符解决这个问题?s1、s2、c1和c2是什么?他们是化名吗?@Mahivatekat很乐意帮忙。我看不出有什么办法可以和工会合作。我当然不会那样处理这个问题。是的,s1,s2。。。是表的别名。c.ssn中的c以及s.name和dbo中的s是什么意思?dbo是表的所有者,c是表课程的别名,c.ssn表示表课程中的ssn,类似地,s是表学生的别名,s.name表示学生表中的name列当我把它放在这里时,它表示拒绝访问。我应该把我(所有者)的名字放在dbo上吗?我修改了查询并删除了所有者,这样它将采用您描述的所有者。c.ssn中的c以及s.name和dbo中的s是什么意思?dbo是表的所有者,c是表课程的别名,c.ssn是表课程中的ssn,同样s是表学生的别名,“s.name”是指学生表中的“name”列,当我把它放在这里时,它表示访问被拒绝。我是否应该将我的(所有者)姓名放在dbo上?我修改了查询并删除了所有者,以便它将采用您所描述的所有者。您是在寻找至少选修了一门与学生C相同的课程的学生,还是在寻找选修与学生C完全相同的课程列表的学生?因为您刚刚接受了一个回答,它会执行前一个(更简单的)查询,我必须假设你正在与“与学生C共同选修任何课程的学生”打交道。是的,我正在寻找与学生C共同选修任何课程的学生。你是否在寻找与学生C至少选修一门课程的学生,或者你是在寻找与学生C所选课程完全相同的学生?因为你刚刚接受了一个回答,回答了前一个(简单得多)问题,所以我必须假设你正在处理“与学生C共同选修任何课程的学生”。是的,我正在寻找选修学生C也选修的任何课程的学生。
select distinct c1.ssn, s1.name from courses c1 // find distinct ssn and name for courses X (defined below)
inner join students s1 on c1.ssn=s1.ssn
where c1.course in
(select course
from courses // use to find all courses (say X) for student c
where ssn =
(select ssn from students where name='c')) // find ssn of student