Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/84.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.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 查询以检索与一个学生相同班级中的所有学生_Sql - Fatal编程技术网

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

Sql 查询以检索与一个学生相同班级中的所有学生,sql,Sql,我对SQL非常陌生/不擅长,我在创建查询以解决下面的问题时遇到困难。我想知道应该采取什么方法来创建适当的查询 杰克在上化学、体育和数学课。找到和杰克在同一个班级的所有学生。班级ID指学生 样本数据 Student StudentID Name 1 Jack 2 Brad 3 Tom 4 Vince 5 Tim Class StudentID(FK) class 1

我对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 *
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类可以变成带有两个外键的多对多映射表。是的,几种不同的方法,这应该是其中一种有效的方法。是的,几种不同的方法,这应该是其中一种有效的方法