2016-09-29 2 views
2

私は基本的にこの1のように見えるのテーブルを持っているがヌルになる埋める:シンプルなWHERE句が、抽出された行を維持し、それらが値

Date  | Criteria 
12-04-2016  123 
12-05-2016  1234 
... 

今、私は内列「基準」内の値とそれらの行を選択したいです与えられた範囲が、私は抽出された行を保持したい。抽出された行は、列 'Criteria'の値 'null'を取得する必要があります。私は、行を選択したいのであれば、たとえば、「基準= 123」私の結果は次のようになります。

Date  | Criteria 
12-04-2016  123 
12-05-2016  null 

現在、私は結果を取得するには、このクエリを使用しています:

SELECT b.date, a.criteria 
FROM (SELECT id, date, criteria FROM ABC WHERE criteria > 100 and criteria < 200) a 
FULL OUTER JOIN ABC b ON a.id = b.id ORDER BY a.criteria 

誰か完全な外部結合が非常にひどく機能すると私に言った。私のテーブルには400000レコードがあり、クエリはかなり頻繁に使用されています。だから誰も私のクエリをスピードアップするアイデアがありますか? Btw私はOracle11gデータベースを使用しています。

+0

基本的に、毎回4kk行のテーブルのフルテーブルスキャンを実行するクエリを頻繁に実行したいのですか?どうして?撮影日に多くの基準がある場合はどうなりますか?あなたは似たような多くの日付を持っていますか日付のインデックスを作成して別の日付を選択するだけでいいのではないでしょうか?select with where critera = 123? – stee1rat

+0

@ stee1ratすでに日付のインデックスがあります。私はまた、ユニオンを使用することができますが、私は多くの日付の重複を持つ結合されたテーブルを取得し、それらのいくつかは、 '基準'の列の実際の値を持っていて、それらのいくつかはnull値です。それらの重複をどのように削除しますか? –

+0

別名を使用してください。それは本当にあなたの目標にかかっています。 – stee1rat

答えて

5

case式がほしいですか?

SELECT date, 
     (case when criteria > 100 and criteria < 200 then criteria end) as criteria 
FROM ABC; 
関連する問題