#sql #join #subquery
#sql #Присоединиться #подзапрос
Вопрос:
Вопрос: Напишите запрос для отображения названия факультетов, в которых меньше всего студентов. Отсортируйте результат на основе названия отдела в порядке возрастания
Мой код:
select department_name
from department d join student s
on d.department_id=s.department_id
having count(*) in (select min(count(student_id))
from student s join department d
on s.department_id=d.department_id
group by d.department_id)
group by department_name
order by department_name;
Примечание:
Student
, Department
это отдельные таблицы
department_id
есть ли первичный ключ в Department
таблице
department_id
работает ли ForeignKey в коде Student
таблицы
идеально (просто нужно сократить это).
Комментарии:
1. привет, это изображение не нужно, вы можете форматировать код, просто сделайте отступ в 4 пробела, и он превратится в код
2. Какую базу данных вы используете?
3. Я не верю, что код работает идеально, потому что он недопустимый (стандартный) SQL —
having
должен появиться послеgroup by
Ответ №1:
Я бы использовал для этого функцию окна:
select d.*
from (
select s.department_id,
count(*) as student_count,
dense_rank() over (order by count(*)) as rnk
from student s
group by s.department_id
) as c
join department d on d.department_id = c.department_id
where c.rnk = 1
order by d.department_name;
Если вы хотите, вы также можете включить фактическое количество учащихся в выходные данные.
Вышеуказанное включает только отделы, в которых есть студенты. Если вам нужно позаботиться о отделах, которым не назначены студенты, вам нужно внешнее соединение:
select d.department_name
from (
select d.department_name,
count(s.student_id) as student_count,
dense_rank() over (order by count(s.student_id)) as rnk
from department d
left join student s on s.department_id = d.department_id
group by d.department_name
) d
where d.rnk = 1;
Оба решения на 100% являются стандартным ANSI SQL и должны работать на любой современной СУБД.