【问题标题】:Is there any way to shorten the followning code?有没有办法缩短以下代码?
【发布时间】:2020-09-13 08:58:53
【问题描述】:

问题:编写查询以显示学生人数最少的部门的名称。按部门名称升序排列结果

我的代码:

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;

注意: StudentDepartment 是单独的表
department_idDepartment 表中的主键
department_idStudent 表中的 ForeignKey
代码完美运行(只需要缩短它)。

【问题讨论】:

  • 你好,不需要那个图片,你可以格式化代码,缩进4个空格就变成了代码
  • 你用的是什么数据库?
  • 我不相信代码可以完美运行,因为它是无效的(标准)SQL - having 需要在 group by 之后出现

标签: sql join subquery


【解决方案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,应该适用于任何现代 DBMS。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-01-24
    • 1970-01-01
    • 1970-01-01
    • 2022-01-05
    • 1970-01-01
    • 1970-01-01
    • 2022-11-18
    相关资源
    最近更新 更多