2017-06-27 11 views
1

をネストされたセレクト帖を使用している間、私が使用またはネストされた選択クエリ を使用しようとしていた。他の方法は、UNION ALLを使用していたするとORを使用すると、SQLでUNIONを使用する

select * from TRANSACTION_LOG 
where GLOBAL_ID IN (select UNIQUE GLOBAL_ID from ORDER_REF where ORDER_ID in ('O01625','O01628','O01640')) 
OR (GLOBAL_ID ='MC11f5f14'); 

を:

select * from TRANSACTION 
where GLOBAL_ID IN (select UNIQUE GLOBAL_ID from ORDER_REF where ORDER_ID in ('O01625','O01628','O01640')) 
UNION ALL 
select * from TRANSACTION 
where GLOBAL_ID ='MC11f5f14'; 

最初のクエリは結果に時間がかかりすぎますが、2番目のクエリは素早く、なぜ、どのように動作するのかわかりません。

+0

私はあなたの質問にどのようにしっかり答えますか? – TomServo

+0

** UNION ALL **は通常、結果として重複を取得するため、より高速です – Frank

答えて

1

最初に、標準SQL構成はselect distinctであり、select uniqueではありません。次に、inではどちらも必要ありません。 union all

select tl.* 
from TRANSACTION_LOG tl 
where tl.GLOBAL_ID in (select o.GLOBAL_ID 
         from ORDER_REF o 
         where o.ORDER_ID in ('O01625', 'O01628', 'O01640') 
        ) or 
     tl.GLOBAL_ID = 'MC11f5f14'; 

同等のクエリは次のとおりです:

select tl.* 
from TRANSACTION_LOG tl 
where tl.GLOBAL_ID = 'MC11f5f14' 
union all 
select tl.* 
from TRANSACTION_LOG tl 
where tl.GLOBAL_ID in (select o.GLOBAL_ID 
         from ORDER_REF o 
         where o.ORDER_ID in ('O01625', 'O01628', 'O01640') 
        ) and 
     tl.GLOBAL_ID <> 'MC11f5f14'; 
-----^ 

注追加の句として

だから、最初のクエリを記述する必要があります。これにより、unionではなく、union allを使用できます。 unionは、重複を削除するため、パフォーマンス上のペナルティが発生します。

どちらが優れていますか?それはデータベースに依存する可能性があります。一部のデータベースには洗練されたオプティマイザがあります。いくつかはしません。いくつかのデータベースは、最適化のためにexistsからinを好む。

一般に、2番目の形式では、最適化の選択肢が増えます。ただし、テーブルに適切なインデックスがない場合、すべてのベットはオフになります。

+0

最初のオプションは結果をフェッチするために永遠に取っていますが、それでもなぜそれほど明確ではありませんか? –

+0

@PrashathKesari。 。 。最初は私が提案している選択肢ではありません。これは標準SQLのために書き直されただけです。 2番目は改良版です。 –

関連する問題