查询以检索与一个学生相同的班级中的所有学生

时间:2014-08-05 22:48:33

标签: sql

我在SQL上很新/不好,我在创建查询以解决下面的问题时遇到了问题。我想知道我应该采取什么方法来创建一个合适的查询。

杰克在化学,健身和数学课上。找到与杰克相同班级的所有学生。班级ID是指学生。

示例数据

Student
StudentID   Name
1           Jack
2           Brad
3           Tom
4           Vince
5           Tim

Class
StudentID(FK)   class
1               Chem
2               Chem
3               Chem
4               Gym
2               Gym
1               Math
2               Cooking
3               Cooking

我到目前为止

SELECT name FROM Student JOIN Class ON (.....)

这些问题对我来说有点令人生畏。我觉得我应该从小开始扩展以创建以下查询,但这对我来说非常困难。如果有人可以推荐资源来帮助创建查询,我会非常乐意看到它们。谢谢!

2 个答案:

答案 0 :(得分:3)

如果我正确理解你,你想找到所有与给定学生至少有一个共同班级的学生吗?我可能只是使用一些嵌套查询。我确信你可以用一个聪明的JOIN做到这一点,我相信有人会建议你,如果可以,但从可读性和简洁性的角度来看,这可以做你正在寻找的东西,它如果没有,那么调试起来非常容易。

SELECT *
FROM [Student]
WHERE EXISTS (SELECT *
              FROM [Class]
              WHERE [Class].[StudentID] = [Student].[ID]
                    AND [class] IN (SELECT [class]
                                    FROM [Class]
                                    WHERE StudentID = @masterStudentId))
      AND StudentID <> @masterStudentId

最后一行只是确保我们不会归还你传入的学生(因为很明显他与自己有相互的课程)。您可能会或可能不想删除它,等待您的实施。

修改

好吧,只是为了好玩,这是一个更复杂的JOIN s,我认为有效。我在this fiddle测试了它。

SELECT DISTINCT StudentB.*
FROM [Student] AS StudentA
INNER JOIN [Class] AS ClassA ON StudentA.StudentID = [ClassA].StudentID
INNER JOIN [Class] AS ClassB ON ClassA.class = [ClassB].class
INNER JOIN [Student] AS StudentB ON StudentB.StudentID = [ClassB].StudentID
WHERE StudentA.StudentID = @masterStudentId

答案 1 :(得分:1)

为了平衡JOIN和嵌套查询的两种方法以提高可读性,以下是一些选项:

看看这个问题,看起来你已经知道杰克所在的课程。如果是这种情况,你可以编写以下简单的一连接查询:

SELECT DISTINCT Student.Name
FROM Student
INNER JOIN Class ON Class.StudentId = Student.StudentId
WHERE Class.class in ('Chem','Gym','Math')
AND Student.Name <> 'Jack'

这将返回上述课程中所有学生的姓名。但是,从您的示例表中看起来杰克实际上并未被列为&#34;健身房&#34; (也许他是一个迟到的注册,还没有在主表中更新!),那么这可能是一个技巧问题吗?我将让你成为法官,但以下将返回与表中所示杰克相同班级的所有学生:

SELECT DISTINCT Student.Name
FROM Student
INNER JOIN Class ON Class.StudentId = Student.StudentId
WHERE Class.class in 
(
    SELECT Class.class FROM Class
    INNER JOIN Student ON Student.StudentId = Class.StudentId
    WHERE Student.Name = 'Jack'
)
AND Student.Name <> 'Jack'

上面的示例只是替换了#34;已知的&#34;具有表格所代表的杰克类列表的类。