我在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 (.....)
这些问题对我来说有点令人生畏。我觉得我应该从小开始扩展以创建以下查询,但这对我来说非常困难。如果有人可以推荐资源来帮助创建查询,我会非常乐意看到它们。谢谢!
答案 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;具有表格所代表的杰克类列表的类。