我需要有关特定查询的帮助

时间:2018-11-08 20:33:00

标签: sql oracle

我陷入了一个问题,无法在我的脑海中创建查询的结构。您能给我一个关于以下问题的起点的想法吗?

列出最多已注册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)

tables

2 个答案:

答案 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 BYHAVING结合使用。我不确定“ 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