Есть ли какой-либо способ сократить следующий код?

#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 и должны работать на любой современной СУБД.