2016-10-29 23 views
1

我有三張表格(學生,教師和成績),我想優化以下查詢,並將一些列索引或創建其他物理結構。我的查詢是這樣的:使用INDEXing進行Oracle數據庫優化

select * from STUDENT S, FACULTY F 
where S.facul=F.facul AND S.grade NOT IN (
select overall from grades G 
where overall > 500 and overall < 1900); 

我不能像「where S.grade <= 500 OR S.grade >= 1900」使用,因爲在成績表中有很多的,我將在以後使用其他選項。所以從GRADES表中選擇是很重要的。

我是Oracle SQL的初學者,所以請幫助我,並且更具體。

+0

你有什麼其他選項在'grades.overall'列?該列應該是NUMBER數據類型(如果不是,這是一個很大的錯誤 - 如果成績是SUPPOSED是數字),所以您必須小心的唯一一件事是在某些行中爲NULL。但是,在外部查詢中也可以正確處理, – mathguy

回答

3

這是您的查詢(重寫了一下):

select * 
from STUDENT S join 
    FACULTY F 
    on S.facul = F.facul 
where S.grade NOT IN (select g.overall 
         from grades G 
         where overall > 500 and overall < 1900 
        ); 

not in是真的沒用。你可以這樣寫:

select * 
from STUDENT S join 
    FACULTY F 
    on S.facul = F.facul 
where S.grade <= 500 OR S.grade >= 1900 ; 

然後,你想索引。我認爲STUDENT(grade, facul)FACTULRY(facul)應該可以工作。

+0

非常感謝!我會嘗試它並比較兩種價格。再次感謝您 –

+0

親愛的@ gordon-linoff,我不能使用像「where S.grade <= 500 OR S.grade> = 1900」,因爲在GRADES表中有很多其他的選項我會用後來。所以從GRADES表 –

+0

@RasulbekAbdurasulov中選擇是很重要的。 。 。如果你有另一個問題,那麼你應該問它作爲另一個問題。期望人們回答你所問的問題是合理的。改變這個問題會很粗魯,因爲它可能會使這個答案無效,反過來也會吸引倒計時。 –