2016-10-29 5 views
1

私は3つのテーブル(学生、教職員および等級)を持っており、次のクエリを最適化して列の一部を索引付けしたり、等級表に、私は、後に使用する他の多くのオプションがあるので、私は、「where S.grade <= 500 OR S.grade >= 1900」のように使用することはできません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); 

:私のクエリはこれです。 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のように、私は 'GRADES'テーブルには私が使用する多くのオプションがあるので、" S.grade <= 500 OR S.grade> = 1900 "後で。したがって、GRADESテーブル –

+0

@ RasulbekAbdurasulovから選択することが重要です。 。 。別の質問がある場合は、別の*質問としてそれを聞かなければなりません。あなたが聞いた質問に人々が答えてくれると期待するのは妥当なことです。この質問を変えることは無礼になるでしょう。おそらく、この答えを無効にしてしまい、これがダウンワードを引き付けます。 –

関連する問題