【发布时间】:2021-01-17 12:58:12
【问题描述】:
我在 Oracle 12 中遇到了一个问题,这个问题最容易用传统的数据库设计方案来解释,即学生、班级和参加称为注册的课程的学生。我很理解这个模型。我有一个场景,我需要得到一个完整的列表,所有学生对所有课程,以及他们是否参加该课程......
让我们在这里使用这个表格设计...
CREATE TABLE CLASSES
(CLASSID VARCHAR2(10) PRIMARY KEY,
CLASSNAME VARCHAR2(25),
INSTRUCTOR VARCHAR2(25) );
CREATE TABLE STUDENTS
(STUDENTID VARCHAR2(10) PRIMARY KEY,
STUDENTNAMENAME VARCHAR2(25)
STUDY_MAJOR VARCHAR2(25) );
CREATE TABLE REGISTRATION
(
CLASSID VARCHAR2(10 BYTE),
STUDENTID VARCHAR2(10 BYTE),
GRADE NUMBER(4,0),
CONSTRAINT "PK1" PRIMARY KEY ("CLASSID", "STUDENTID"),
CONSTRAINT "FK1" FOREIGN KEY ("CLASSID") REFERENCES "CLASSES" ("CLASSID") ENABLE,
CONSTRAINT "FK2" FOREIGN KEY ("STUDENTID") REFERENCES "EGR_MM"."STUDENTS" ("STUDENTID") ENABLE
) ;
因此假设以下... 300 名学生和 15 个不同的班级... 注册表将显示有多少学生参加了多少个班级... 我需要的是该信息加上所有未采取的组合。 ..即我需要一个显示所有可能组合的报告(SQL语句)......即300 x 15,然后该行是否存在于注册表中......例如,输出应该如下所示......
STUDENTID Class1_GRADE Class2_Grade Class3_Grade` Class4_Grade
101 A B Not Taking A
102 C Not Taking Not Taking Not Taking
****** THIS STUDENT NOT TAKING ANY CLASSES So NOT in the Registrations Table
103 Not Taking Not Taking Not Taking Not Taking
这也可以,我可能可以做一个 PIVOT 来获得上面的列表。
STUDENTID CLASSID GRADE
101 Class1 A
101 Class2 B
101 Class3 Not Taking
101 Class4 A
...
102 Class1 C
102 Class2 Not Taking
102 Class3 Not Taking
102 Class4 Not Taking
...
103 Class1 Not Taking // THIS STUDENT NOT TAKING ANY CLASSES
103 Class2 Not Taking
103 Class3 Not Taking
103 Class4 Not Taking
我该如何填写缺失的数据,即未上过的学生和班级的组合...?
【问题讨论】: