2012-01-23 3 views
2

Oracle SQL - どこのスペースに3 "とexists()より高速ですか?

Select distinct id_no 
from revenue_table 
where (exists (select * from revenue_table i 
     where revenue_type = 'Shipping' and i.id_no = r.id_no) 
    and exists(select * from revenue_table i 
     where revenue_type = 'Reproduction' and i.id_no = r.id_no) 
    and exists(select * from revenue_table i 
     where revenue_type = 'Tape' and i.id_no = r.id_no)) 

id_noを書くためのより良い方法はありますが、フォーム上の各収入項目に対して一回表に入力されたフォームを表します。同じrevenue_typeが複数回表示されることがあります。 ORロジックを使用して動作する多くの高度な機能がありますが、ANDセット理論を使用する関数を見つけることはできません。もし、GROUP BYにid_noのようなグループを(配送、複製、テープ)のようなものと比較する機能があれば、本当にいいです。

これはありますか?

答えて

5

別のオプションは、あなたはそれが改善されているかどうかをテストする必要があります

SELECT id_no 
FROM revenue_table 
WHERE revenue_type IN ('Tape', 'Shipping', 'Reproduction') 
GROUP BY id_no 
HAVING COUNT(DISTINCT revenue_type) = 3 

だろう。

+0

+1:テーブルのシングルスキャンは、私が言うことができる限りそれを打ち負かすつもりはありません。 – MatBailie

+0

私はいくつかのテストを実行しました。実行している大きなテーブルで実行時間が約20%短縮されているように見えます。私は以前は "count(distinct)"ステートメントを使用することはなかった。 – Matt

+0

@Matt - あなたは '(id_no、revenue_type)'のインデックスを持っていますか? – MatBailie

1

はい、あなたはINNER JOINでそれを行うことができます。

select distinct r.id_no 
from revenue_table r 
inner join revenue_table i1 on i1.id_no = r.id_no and i1.revenue_type = 'Shipping' 
inner join revenue_table i2 on i2.id_no = r.id_no and i2.revenue_type = 'Reproduction' 
inner join revenue_table i3 on i3.id_no = r.id_no and i3.revenue_type = 'Tape' 
+0

これは、** DISTINCTキーワードが存在するため、** **に相当することに注意してください。 – Benoit

2

多くの関係演算子は論理ANDを意味する。参加、制限、延長、交差点。

SQLのINTERSECTは、ここでは適切です。

SELECT id_no 
    FROM revenue_table 
WHERE revenue_type = 'Shipping' 
INTERSECT 
SELECT id_no 
    FROM revenue_table 
WHERE revenue_type = 'Reproduction' 
INTERSECT 
SELECT id_no 
    FROM revenue_table 
WHERE revenue_type = 'Tape'; 
関連する問題