2014-03-06 141 views
1

試着做出一個查詢,選擇下一季度的課程,你已經採取了先決條件。對我來說很困難的是,如果有一門課程有多個先決條件,而且你已經完成了一門。SQL查詢在大數據集上運行但速度很慢?

兩個表是記錄(學生,課程)和先決條件(課程,前提條件)

我的查詢嘗試的作品,但速度很慢:

select r.Student, p.Course 
from Record r, Prerequisite p where r.Course = p.Prereq and p.Course not in 
(select Course from (select r.Student, p.Course from Record r, Prerequisite p 
    where r.Course <> p.Prereq) a where a.Student = r.Student); 

任何幫助將是巨大的!

的樣本數據

CREATE TABLE Prerequisite (Course CHAR(32), Prereq CHAR(32)); 
CREATE TABLE Record (
    Student CHAR(32), 
    Course CHAR(32), 
    PRIMARY KEY (Student, Course) 
); 
INSERT INTO Prerequisite VALUES ('Class 3', 'Class 1'); 
INSERT INTO Prerequisite VALUES ('Class 6', 'Class 4'); 
INSERT INTO Prerequisite VALUES ('Class 4', 'Class 1'); 
INSERT INTO Prerequisite VALUES ('Class 4', 'Class 3'); 
INSERT INTO Prerequisite VALUES ('Class 8', 'Class 2'); 
INSERT INTO Prerequisite VALUES ('Class 8', 'Class 6'); 
INSERT INTO Prerequisite VALUES ('Class 5', 'Class 2'); 
INSERT INTO Prerequisite VALUES ('Class 9', 'Class 8'); 
INSERT INTO Prerequisite VALUES ('Class 7', 'Class 5'); 
--added Class 10 requires Class 1 and Class 2 
INSERT INTO Prerequisite VALUES ('Class 10', 'Class 1'); 
INSERT INTO Prerequisite VALUES ('Class 10', 'Class 2'); 

INSERT INTO Record VALUES ('Bob', 'Class 1'); 
INSERT INTO Record VALUES ('Jan', 'Class 2'); 
--Bob Takes both Class 1 and Class 2 thus he can take Class 10 
INSERT INTO Record VALUES ('Bob', 'Class 2'); 

所以結果應該是

Bob | Class 3 
Jan | Class 5 
Bob | Class 5 
Bob | Class 10 

編輯:小樣本數據添加

EDIT2:請參見下面的註釋瞭解更多詳細信息

EDIT3:只需意識到我的解決方案在查看Mhai的新解決方案時並不奏效並做出一個測試用例,表明它沒有工作,我也沒有爲這種情況工作。

使用新的測試用例更新了示例數據,也就是說,當您有一個學生已經爲一個課程同時採用了兩個先決條件時,他們應該選擇該課程。

+0

添加一些示例數據。 – Mihai

+1

和往常一樣 - 檢查索引併發布查詢計劃。 – TomTom

+0

添加了我用來測試疑難案例的示例數據。我首先解決了如果只有一個可能的先決條件,通過檢查prerequisite.prereq是否包含記錄課程中的任何課程,學生已採取並將它與具有prerequisite.class中的prereq的課程進行匹配的情況,在一個類有多個prereq的情況下,它不起作用。 – blue

回答

2

嘗試

SELECT r.Student, p.Course FROM Record r 
JOIN Prerequisite p 
ON r.Course = p.Prereq 
LEFT JOIN (
    select r.Student, p.Course FROM Record r 
    JOIN Prerequisite p 
    ON p.Prereq<>r.Course)x 
ON x.Student = r.Student 
WHERE p.Course IS NULL 

SELECT r.Student,p.Course,pp.Prereq FROM Record r 
JOIN Prerequisite p 
ON r.Course = p.Prereq 
JOIN Prerequisite pp 
ON 
p.Course=pp.Course 
GROUP BY p.Course HAVING COUNT(*)=1 

這會發現所有的記錄只有1所要求

Fiddle

+0

嗯,這個查詢沒有返回任何結果。 r.Student之後刪除了額外的逗號。 – blue

+0

Mihai只爲我在那裏的示例數據工作,但它不適用於我發佈的上面新的更新示例數據。 – blue

+0

@blue對不起,我絞盡腦汁,coudnt解決了所有可能的情況。需要更有知識的人。 – Mihai

0
select r.Student, p.Course 
from Record r inner join Prerequisite p on p.Prereq = r.course where not exists(
(select pr.Course from Prerequisite pr inner join records rr on rr.student=r.student 
where pr.Prereq =r.course)) 

試試這個,使用NOLOCK如果你買得起有髒記錄。

+0

在修改拼寫錯誤記錄以進行記錄之後,這並未返回上述示例數據的任何結果。 – blue

相關問題