首页 > 解决方案 > SQL查找所有注册学生数量超过该课程允许的enroll_limit的课程

问题描述

我目前正在上数据库课,但由于今晚的作业问题而陷入困境

查找“斯隆”大楼中招收的学生人数超过其注册人数限制的课程。返回 courseno、enroll_limit 和这些课程的实际注册。

我一直在努力计算每门课程有多少学生。

CREATE TABLE Course ( 
courseno   VARCHAR(7), 
credits    INTEGER NOT NULL, 
enroll_limit INTEGER, 
classroom   VARCHAR(10), 
PRIMARY KEY(courseNo), ); 

CREATE TABLE Student ( 
sID   CHAR(8),
sName   VARCHAR(30), 
major VARCHAR(10), 
trackcode   VARCHAR(10), 
PRIMARY KEY(sID), 
FOREIGN KEY (major,trackcode) REFERENCES Tracks(major,trackcode) );

CREATE TABLE Enroll ( 
courseno    VARCHAR(7), 
sID   CHAR(8), 
grade FLOAT NOT NULL, 
PRIMARY KEY (courseNo, sID), 
FOREIGN KEY (courseNo) REFERENCES Course(courseNo), 
FOREIGN KEY (sID) REFERENCES Student(sID) );

我目前非常失败的尝试是

SELECT sloancourse.courseno 
FROM course sloancourse 
WHERE 
    sloancourse.classroom = 'Sloan' 
    and sloancourse.courseno IN ( 
        SELECT c.courseno 
        FROM student s, enroll e, course c 
        WHERE 
            c.courseno = e.courseno 
            and s.sid = e.sid 
            and sloancourse.courseno = c.courseno 
    )
; 

标签: sql

解决方案


查找“斯隆”大楼中招收的学生人数超过其注册人数限制的课程。返回 courseno、enroll_limit 和这些课程的实际注册。

您通常会选择join课程和注册(使用标准连接语法,使用on关键字)、group by课程,最后过滤学生使用having子句计数的课程。

select
    c.courseno,
    c.enroll_limit,
    count(*) actual_enrollment
from course c
inner join enroll e on e.courseno= c.courseno
where c.classroom = 'Sloan'
group by c.courseno, c.enroll_limit
having count(*) > c.enroll_limit

请注意,您无需引入student表格即可获得所需的结果。


推荐阅读