2011-11-14 4 views
1

データを選択する必要がある場合、他のデータをexepctする必要がある場合は、私のSQLクエリを構築するためにどのようなアプローチをとるべきですか?例えば「EXCEPT」以外のデータを選択する必要がある場合は、どのようなアプローチをとるべきですか?

、私の

Iそう除いて、この結果セットのデータ・ベースからすべてのデータを選択します:

SELECT * 
FROM table1 
WHERE table1.MarketTYpe = 'EmergingMarkets' 
AND IsBigOne = 1 
AND MarketVolume = 'MIDDLE' 
AND SomeClass = 'ThirdClass' 

は私がIN

  • 、NOTを使用すべきを(アボー結果セット)
  • またはshoudlのような条件のINVERSEを得る!= inseat of =等
  • または?

アドバイスがありますか?ここ

答えて

6

使用EXCEPT構築物中のオペレータを除きORACLE で?

SELECT * 
FROM table1 
EXCEPT 
SELECT * 
FROM table1 
WHERE table1.MarketTYpe = 'EmergingMarkets' 
AND IsBigOne = 1 
AND MarketVolume = 'MIDDLE' 
AND SomeClass = 'ThirdClass' 

EXCEPTNOT EXISTSは「左反半が参加し、」使用して、同じクエリプランを与えることに注意してください。サブクエリ内のNULL値がある場合

NOT IN (subquery with above)は、それゆえ私はそれがすぐに
読めないので、私はWHERE句で否定を避けるだろう

を使用することはありません、正しい結果が得られない場合がありますコメントは「いくつかの行を除くすべての行」の詳細について

...マイケルの答えに示したように、これらを参照してください。

+0

パフォーマンスについて心配する必要はありますか? =などの代わりに<>の使用に比べて? – pencilCake

+0

@pencilcake:EXCEPTとNOT EXISTSは意味的に正確で速くなります(省略する行を見つけるためには半結合です)。非SargableでもWHERE節に否定を使用する – gbn

+0

+1 - SARGableの側面は、おそらく最も説得力のある議論である – Andrew

2

最も単純で、おそらく最速のは、単純に条件を反転させることである。

SELECT * 
FROM table1 
WHERE table1.MarketTYpe <> 'EmergingMarkets' 
    OR IsBigOne <> 1 
    OR MarketVolume <> 'MIDDLE' 
    OR SomeClass <> 'ThirdClass' 

これはNOT IN()を行うよりも多くに少ないリソースを使用する可能性があります。それらをベンチマークして特定することもできますが、上記の方が高速になる可能性があります。

+2

あなたは 'OR'、ない' AND'をしたいです。 – drdwilcox

+0

@drdwilcoxなぜですか? 'MarketType <> 'を実行するEmergingMarketsのOR IsBigOne <> 1は、IsBigOne = 0のときにはMarketType =' EmergingMarkets 'を返します。それは私がOPの望む結果を理解する方法ではありません。 –

+0

@drdwilcoxを「OR」に切り替えると、ここで論理が大幅に変更されます。私はそれがOPの意図であるとは思わない。 –

1

NOT INを使用すると、NOT IN selectステートメントのサブセットを除いたメインのSELECTステートメントでそのセットを使用することが明確になるためです。

+0

次に、私は速く、より読みやすいオプションのどちらかを決めなければなりません。 – pencilCake

+1

あなたはこれが遅くなると思いますか?クエリオプティマイザは、同じ実行計画を生成することがあります。どちらの方が速いのかを判断するには、すべてのアプローチをテストする必要があります。 –

+0

サブクエリにNULL値がある場合、NOT INは必ずしも正しいとは限りません。一般的には、このためにINを避けるべきです:NOT EXISTSまたはEXCEPTを使って*正しい*と一貫性を持たせてください – gbn

2

どのデータベースエンジンですか?

マイナス演算子SQL Server

1

私はGBNの答えを好きですが、それを行うための別の方法を使用できます

SELECT * 
FROM table1 
WHERE NOT (table1.MarketTYpe = 'EmergingMarkets' 
AND IsBigOne = 1 
AND MarketVolume = 'MIDDLE' 
AND SomeClass = 'ThirdClass') 
関連する問題