Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 我如何知道修过某门课程的先修课程的学生人数?_Sql_Oracle - Fatal编程技术网

Sql 我如何知道修过某门课程的先修课程的学生人数?

Sql 我如何知道修过某门课程的先修课程的学生人数?,sql,oracle,Sql,Oracle,我正在尝试实现一个查询,选择修过某门课程的先决条件的学生人数,如果该课程只有一个先决条件,我可以使用join语句来实现,但如果有许多先决条件,我会遇到麻烦, 我有此查询所需的以下表格 enroll( Student_id,course_id,semester) studyplan(major_id,course_id, creditHours) prerequisite(course_id, prerequisite_id) 请帮帮我。。我的时间不多了。你可以试试这个,但学生是否具备了先决条

我正在尝试实现一个查询,选择修过某门课程的先决条件的学生人数,如果该课程只有一个先决条件,我可以使用join语句来实现,但如果有许多先决条件,我会遇到麻烦, 我有此查询所需的以下表格

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