Sql 查询以检索与一个学生相同班级中的所有学生
我对SQL非常陌生/不擅长,我在创建查询以解决下面的问题时遇到困难。我想知道应该采取什么方法来创建适当的查询 杰克在上化学、体育和数学课。找到和杰克在同一个班级的所有学生。班级ID指学生 样本数据Sql 查询以检索与一个学生相同班级中的所有学生,sql,Sql,我对SQL非常陌生/不擅长,我在创建查询以解决下面的问题时遇到困难。我想知道应该采取什么方法来创建适当的查询 杰克在上化学、体育和数学课。找到和杰克在同一个班级的所有学生。班级ID指学生 样本数据 Student StudentID Name 1 Jack 2 Brad 3 Tom 4 Vince 5 Tim Class StudentID(FK) class 1
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 *
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
如果我理解正确,你想找到与给定学生至少有一个共同课堂的所有学生吗?我可能只会使用一些嵌套查询。我相信你可以用一个聪明的连接来实现它,我相信有人会建议你,如果可以的话,但仅仅从可读性和简单性的角度来看,这会满足你的需要,如果没有,调试起来会很容易
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
为了平衡联接查询和嵌套查询这两种方法以增强可读性,以下是一些选项: 看看这个问题,你似乎已经知道杰克在哪个班了。如果是这种情况,您可以编写以下简单的单连接查询:
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'
这将返回所述课程中所有学生的姓名。但是,从您的示例表中可以看出,Jack实际上没有被列为正在健身房,可能他注册晚了,并且还没有在主表中更新!,那么这是一个诡计问题吗?我让你来做评判,但以下内容将返回表中所示与Jack同班的所有学生:
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'
上面的示例只是将已知的类替换为表中所示的Jack类列表。为了平衡联接查询和嵌套查询这两种方法以增强可读性,以下是一些选项: 看看这个问题,你似乎已经知道杰克在哪个班了。如果是这种情况,您可以编写以下简单的单连接查询:
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'
这将返回所述课程中所有学生的姓名。但是,从您的示例表中可以看出,Jack实际上没有被列为正在健身房,可能他注册晚了,并且还没有在主表中更新!,那么这是一个诡计问题吗?我让你来做评判,但以下内容将返回表中所示与Jack同班的所有学生:
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'
上面的示例只是用表中表示的Jack类列表替换已知类。我建议重命名类表中的ID字段。有人会认为它是班级的ID,但它似乎真的是学生表的外键。@KathyA。谢谢你,我忘了在问题中提到taht,也规范了课程表,让化学、体育、数学等课程类型成为自己的一张表。然后,table类可以变成带有两个外键的多对多映射表。我建议重命名类表中的ID字段。有人会认为它是班级的ID,但它似乎真的是学生表的外键。@KathyA。谢谢你,我忘了在问题中提到taht,也规范了课程表,让化学、体育、数学等课程类型成为自己的一张表。table类可以变成带有两个外键的多对多映射表。是的,几种不同的方法,这应该是其中一种有效的方法。是的,几种不同的方法,这应该是其中一种有效的方法