2016-12-06 30 views
-3

正如標題所示,我試圖輸出任何在模塊中參加考試的學生的身份,前提模塊的考試。查詢查找任何在模塊中參加考試的學生的身份,而無需考取先決模塊

我使用的表稱爲學生,考試和先決條件,並且像這樣佈局:

STUDENT 

Student_name | Student_id | Course_name | Year 

Exam 

Student_id | Module_code | Exam_year | Score 

PREREQUISITES 

Module_code | Prerequisite_code 

還有其他的表例如在prerquisites中用於外鍵module_code和prerequisite_code的模塊但是我不認爲它與這個問題有關。

我有查詢,以獲得問題即student_id數據,Module_code和前提碼的每個部件

SELECT student_id FROM student; 

SELECT Module_code FROM exam WHERE Student_id = <EachPreviousFoundID>; 

SELECT Prerequisite_code FROM prerequisites WHERE Module_code = <EachPreviousFoundModule>; 

但是我不知道如何將這些三個查詢綁定在一起來創建一個查詢,這將找到每個特定學生每次考試的模塊代碼,然後確保他們也採用了必備模塊。

在此先感謝

+0

這看起來像功課就像你所有的的問題。你見過[** JOIN **](http://www.w3schools.com/sql/sql_join.asp)的例子嗎? –

+0

嘗試「加入」或「進入」和「不進入」條件。嘗試一下,發佈你能夠獲得的。祝你好運。 – Kacper

回答

0

這是如何使用集合做到這一點:

甲骨文設置

CREATE TYPE stringlist IS TABLE OF VARCHAR2(100); 
/

查詢

SELECT e.student_id, 
     t.COLUMN_VALUE AS module_code, 
     p.prerequisites MULTISET EXCEPT e.modules_taken AS missing_prerequisites 
FROM (-- All the modules each student has taken. 
     SELECT student_id, 
       CAST(COLLECT(module_code) AS stringlist) AS modules_taken 
     FROM exam 
     GROUP BY student_id 
     ) e, 
     TABLE(e.modules_taken) t, 
     (-- All the prerequisites for each module 
     SELECT module_code, 
       CAST(COLLECT(prerequisite_code) AS stringlist) AS prerequisites 
     FROM prerequisites 
     GROUP BY module_code 
     ) p 
WHERE t.COLUMN_VALUE = p.module_code 
AND p.prerequisites MULTISET EXCEPT e.modules_taken IS NOT EMPTY;