#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')