Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在SQL中找到正在学习C课程的学生C的同学?_Sql_Union - Fatal编程技术网

如何在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
中的是主键

我需要找出参加student
C
课程的学生(包括结果解决方案中的
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