2016-03-20 4 views
-5

私は、特定のコースの前提条件を取った学生の数を選択するクエリを実装しようとしています。コースの前提条件が1つしかない場合は、joinステートメントを使用して実装できます。 「..私は時間が不足していてください助けがコースの前提条件を履修した学生の数を知るにはどうすればよいですか?

enroll( Student_id,course_id,semester) 
studyplan(major_id,course_id, creditHours) 
prerequisite(course_id, prerequisite_id) 

私はこのクエリのために必要とされる以下の表を持って 、トラブルに直面メートル。

+2

ようこそ。 [よくある質問と回答](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

+0

だから、基本的に私たちはあなたの宿題をしたいと思います。あなたがちょうど想起した存在の期限に近づいています。あなたの努力を払い、問題を明確にするのはどうですか? –

+0

MySQLとOracleは2つの異なるRDBMSです。両方にタグを付けることを意味しましたか?そうでない場合は、関連するタグだけに質問を編集してください。 – MT0

答えて

0

これを試すことができますが、学生が決定するものは前提条件を満たしていますか? おそらく、テーブルの前提条件が...

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 
+0

私はこのエラーを受け取ります: 'ORA-00918:列があいまいに定義されました。 ' – MT0

+0

私はテストしませんが、今はOKです。 –

1

を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); 

出力

バインド変数courseidsemesterはですそれぞれ、および'2016-03-20'である。

STUDENT_ID 
---------- 
     3 
     5 

学生1と2は、前提条件のコースに登録されていません。学生4は前提条件のコースに登録されていますが、コース3と4は指定された日付以降の学期がありますので、数えません。学生3と5はすべての前提条件を満たし、出力されます。

+0

あなたの助けてくれてありがとう..私はコード全体を試みたが、私は(選択された行がない) – Rani

関連する問題