Sql 我如何知道修过某门课程的先修课程的学生人数?
我正在尝试实现一个查询,选择修过某门课程的先决条件的学生人数,如果该课程只有一个先决条件,我可以使用join语句来实现,但如果有许多先决条件,我会遇到麻烦, 我有此查询所需的以下表格Sql 我如何知道修过某门课程的先修课程的学生人数?,sql,oracle,Sql,Oracle,我正在尝试实现一个查询,选择修过某门课程的先决条件的学生人数,如果该课程只有一个先决条件,我可以使用join语句来实现,但如果有许多先决条件,我会遇到麻烦, 我有此查询所需的以下表格 enroll( Student_id,course_id,semester) studyplan(major_id,course_id, creditHours) prerequisite(course_id, prerequisite_id) 请帮帮我。。我的时间不多了。你可以试试这个,但学生是否具备了先决条
enroll( Student_id,course_id,semester)
studyplan(major_id,course_id, creditHours)
prerequisite(course_id, prerequisite_id)
请帮帮我。。我的时间不多了。你可以试试这个,但学生是否具备了先决条件? 可能表格先决条件应该有Student_id字段
select studyplan.course_id, count(Student_id)
from enroll, studyplan
where exists(select 1 from prerequisite where enroll.course_id = prerequisite.course_id)
and studyplan.course_id = enroll.course_id
group by studyplan.course_id
您可以使用
COLLECT
aggreagtion函数和SUBMULTISET
操作符来执行此操作
Oracle设置
CREATE TABLE Courses ( ID INT PRIMARY KEY );
CREATE TABLE Students ( ID INT PRIMARY KEY );
CREATE TABLE Enroll(
Student_ID INT REFERENCES Students(ID),
Course_ID INT REFERENCES Courses(ID),
Semester DATE
);
CREATE TABLE StudyPlan(
Major_ID INT,
Course_ID INT REFERENCES Courses(ID),
Credit_Hours INT
);
CREATE TABLE Prerequisite(
Course_ID INT REFERENCES Courses(ID),
Prerequisite_ID INT REFERENCES Courses(ID)
);
INSERT INTO Courses
SELECT LEVEL FROM DUAL CONNECT BY LEVEL <= 5;
INSERT INTO Students
SELECT LEVEL FROM DUAL CONNECT BY LEVEL <= 5;
INSERT INTO Prerequisite
SELECT 5, 1 FROM DUAL UNION ALL
SELECT 5, 2 FROM DUAL UNION ALL
SELECT 5, 3 FROM DUAL UNION ALL
SELECT 5, 4 FROM DUAL;
INSERT INTO Enroll
SELECT 1, 1, ADD_MONTHS( SYSDATE, -1 ) FROM DUAL UNION ALL
SELECT 1, 2, ADD_MONTHS( SYSDATE, -1 ) FROM DUAL UNION ALL
SELECT 1, 3, ADD_MONTHS( SYSDATE, -1 ) FROM DUAL UNION ALL
SELECT 2, 2, ADD_MONTHS( SYSDATE, -1 ) FROM DUAL UNION ALL
SELECT 2, 3, ADD_MONTHS( SYSDATE, -1 ) FROM DUAL UNION ALL
SELECT 2, 4, ADD_MONTHS( SYSDATE, -1 ) FROM DUAL UNION ALL
SELECT 3, 1, ADD_MONTHS( SYSDATE, -1 ) FROM DUAL UNION ALL
SELECT 3, 2, ADD_MONTHS( SYSDATE, -1 ) FROM DUAL UNION ALL
SELECT 3, 3, ADD_MONTHS( SYSDATE, -1 ) FROM DUAL UNION ALL
SELECT 3, 4, ADD_MONTHS( SYSDATE, -1 ) FROM DUAL UNION ALL
SELECT 4, 1, ADD_MONTHS( SYSDATE, -1 ) FROM DUAL UNION ALL
SELECT 4, 2, ADD_MONTHS( SYSDATE, -1 ) FROM DUAL UNION ALL
SELECT 4, 3, ADD_MONTHS( SYSDATE, 1 ) FROM DUAL UNION ALL
SELECT 4, 4, ADD_MONTHS( SYSDATE, 1 ) FROM DUAL UNION ALL
SELECT 5, 1, ADD_MONTHS( SYSDATE, -1 ) FROM DUAL UNION ALL
SELECT 5, 2, ADD_MONTHS( SYSDATE, -1 ) FROM DUAL UNION ALL
SELECT 5, 3, ADD_MONTHS( SYSDATE, -1 ) FROM DUAL UNION ALL
SELECT 5, 4, ADD_MONTHS( SYSDATE, -1 ) FROM DUAL;
CREATE OR REPLACE TYPE INTLIST AS TABLE OF INT;
/
学生1和2没有参加先修课程。学生4已经注册了先修课程,但课程3和课程4的学期日期在指定日期之后,因此不计算在内。学生3和5具备所有的先决条件,并且是输出。欢迎参加SO。请阅读,所以基本上你希望我们做你的家庭作业,而你已经接近了你刚刚回忆起的存在的最后期限。如何继续努力并澄清问题?MySQL和Oracle是两种不同的RDBMS。你是想给他们两个都贴标签吗?如果不是,那么请编辑你的问题只标记相关的。对不起,这是我问的第一个问题。我不知道我该怎么考虑……这不是一个家庭作业。这是一个更大的项目,我正在尝试,但我是新的SQL一般。我得到这个错误:<代码> ORA-900918:列含糊定义的< /代码>我不测试,但是现在应该可以了。谢谢你的帮助..我尝试了整个代码,但是我得到了(没有选择行)
WITH prereq ( prerequisite_ids ) AS (
SELECT CAST( COLLECT( prerequisite_id ) AS INTLIST )
FROM Prerequisite
WHERE Course_ID = :courseid
),
enrollments ( student_id, course_ids ) AS (
SELECT student_id,
CAST( COLLECT( course_id ) AS INTLIST )
FROM enroll
WHERE semester < TO_DATE( :semester, 'YYYY-MM-DD' )
GROUP BY student_id
)
SELECT student_id
FROM prereq p
INNER JOIN enrollments e
ON ( p.prerequisite_ids SUBMULTISET OF e.course_ids );
STUDENT_ID
----------
3
5