我陷入了一个问题,无法在我的脑海中创建查询的结构。您能给我一个关于以下问题的起点的想法吗?
列出最多已注册2名学生的那些学科的数据(密码,讲师,注册的学生人数)(不要忘记没有人注册过的学科)
我的桌子是;
ENROLLMENTS
ENROLLMENT_ID NUMBER(10,0) No
SUBJECT NUMBER(10,0) Yes
STUDENT NUMBER(10,0) Yes
ENROLLMENTDATE DATE No
FIRSTENROLL NUMBER(1,0) No
PARITY NVARCHAR2(4 CHAR) No
EXAMDATE DATE No
STUDENTS
STUDENT_ID NUMBER(10,0)
NEPTUNCODE NVARCHAR2(6 CHAR)
NAME NVARCHAR2(30 CHAR)
ADDRESS NVARCHAR2(50 CHAR)
DATEOFBIRTH DATE
ENTRANCEYEAR NUMBER(4,0)
SUBJECTS
SUBJECT_ID NUMBER(10,0)
NEPTUNCODE NVARCHAR2(10 CHAR)
SUBJECTNAME NVARCHAR2(30 CHAR)
LECTURER NVARCHAR2(30 CHAR)
DAY1 NVARCHAR2(2 CHAR)
DAY2 NVARCHAR2(2 CHAR)
ROOM NVARCHAR2(10 CHAR)
答案 0 :(得分:1)
我会使用HAVING
子句将计数限制为2
,将SQL构建为一个内联视图以对注册进行计数。然后,我将在内联视图上使用LEFT JOIN
,以确保没有注册的受试者获得enrollment_count
中的NULL
。最后,使用NVL
函数(仅Oracle。对于其他数据库,请尝试COALESCE
)将所有NULL
的值默认为0
。
您的问题不需要使用STUDENTS
表,因为它只涉及计数注册。
代码如下:
SELECT
s.neptuncode,
s.lecturer,
NVL(enr.enrollment_count,0) AS enrollment_count
FROM subjects s
LEFT JOIN (
SELECT
e.subject_id,
COUNT(*) AS enrollment_count
FROM enrollments e
GROUP BY e.subject_id
HAVING COUNT(*) <= 2
) enr ON enr.subject = s.subject_id;
答案 1 :(得分:0)
您可能希望将GROUP BY
与HAVING
结合使用。我不确定“ NEPTUNCODE”是什么-不确定您的主要关系在这里,但是看看是否可行。
编辑:根据添加到问题的键图像进行更新。
SELECT SUBJECTS.NEPTUNCODE,
SUBJECTS.LECTURER,
COUNT(DISTINCT STUDENTS.STUDENT_ID) STUDENTS
FROM SUBJECTS
LEFT JOIN ENROLLMENTS ON ENROLLMENTS.SUBJECT = SUBJECTS.SUBJECT_ID
LEFT JOIN STUDENTS ON ENROLLMENTS.STUDENT = STUDENTS.STUDENT_ID
GROUP BY SUBJECTS.NEPTUNCODE, SUBJECTS.LECTURER
HAVING COUNT(DISTINCT STUDENTS.STUDENT_ID) <= 2