Найдите имя и возраст самого младшего студента, который изучает английский язык или записался на курс, преподаваемый Ivana Teach

#sql

#sql

Вопрос:

Схема выглядит следующим образом:

 Student(snum: integer primary key, sname: varchar(40), major: varchar(40), level: varchar(40), age: integer)

Faculty (fid: integer primary key, fname: varchar(40), deptid: integer)

Class(name: varchar(40) primary key, meets at: varchar(40), room: varchar(40), fid: integer references faculty)

Enrolled(snum: integer references student, cname: varchar(40) references Class(name))
 

Запрос, который я написал :

  select min(student.age),student.sname
 from student
 inner join enrolled 
 on enrolled.snum = student.snum or student.major = 'English' 
 inner join class 
 on  enrolled.cname = class.name  
 inner join faculty 
 on faculty.fid = class.fid and faculty.fname='Ivana Teach' 
 group by student.age 
 having student.age=min(student.age);
 

Это дает результат :

min(student.age) sname
21 Мария Уайт
19 Джозеф Томпсон
20 Кристофер Гарсия
17 Лиза Уокер
18 Пол Холл

Почему я получаю такой ответ, где правильным ответом будет одна запись, которая равна 17 Lisa Walker

Комментарии:

1. Я удалил несовместимые теги базы данных. Пожалуйста, помечайте только ту базу данных, которую вы действительно используете.

2. Не добавляйте повторно оба тега, Пракхар, они оба были удалены по какой-то причине. Помечайте только те СУБД, которые вы действительно используете.

3. Почему я получаю такой ответ, в котором правильным ответом будет одна запись — ну, либо ошибка в вашем запросе, либо ошибка в СУБД..

4. Пожалуйста, поделитесь некоторыми примерами данных и укажите имя базы данных, которую вы используете.

Ответ №1:

group by student.age будет группироваться по возрасту, то есть это приведет к результатам, которые показывают минимальный возраст учащихся для каждой возрастной группы, что не то, что вы предполагали, поэтому эту часть следует удалить.

having student.age=min(student.age) также является избыточным. Предложение HAVING используется, когда вы хотите выполнить фильтрацию по некоторым агрегированным критериям. Например (полностью выдуманный), если вы хотите найти студентов, сумма баллов по всем предметам которых превышает 100, вы бы сделали group by student.sname having sum(student.scores) > 100 . Опять же, это не то, что вы хотите в своем конкретном запросе, поэтому эту часть следует удалить.

Что касается ваших внутренних соединений:

 inner join enrolled on enrolled.snum = student.snum or student.major = 'English' 
inner join class on  enrolled.cname = class.name  
inner join faculty on faculty.fid = class.fid and faculty.fname='Ivana Teach'
 

Чтобы найти студентов, изучающих английский язык или записавшихся на курс, преподаваемый Ivana Teach, вместо этого следует использовать предложение WHERE следующим образом:

 inner join enrolled on enrolled.snum = student.snum  
inner join class on  enrolled.cname = class.name  
inner join faculty on faculty.fid = class.fid 
where (student.major = 'English' or faculty.fname='Ivana Teach')