をSTUDENT_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;
/
クエリ:
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);
出力:
バインド変数courseid
とsemester
はですそれぞれ、および'2016-03-20'
である。
STUDENT_ID
----------
3
5
学生1と2は、前提条件のコースに登録されていません。学生4は前提条件のコースに登録されていますが、コース3と4は指定された日付以降の学期がありますので、数えません。学生3と5はすべての前提条件を満たし、出力されます。
ようこそ。 [よくある質問と回答](http://stackoverflow.com/help/on-topic)[よくある質問とその回答](http://stackoverflow.com/help/on-topic) -ask) そして[完璧な質問](http://codeblog.jonskeet.uk/2010/08/29/writing-the-perfect-question/) – RiggsFolly
だから、基本的に私たちはあなたの宿題をしたいと思います。あなたがちょうど想起した存在の期限に近づいています。あなたの努力を払い、問題を明確にするのはどうですか? –
MySQLとOracleは2つの異なるRDBMSです。両方にタグを付けることを意味しましたか?そうでない場合は、関連するタグだけに質問を編集してください。 – MT0