2017-02-16 6 views
1

は私のクエリはは句の中で、より良い方法

select id from table1 where date1 >= eDate1 and date1 <= eDate2 and zId = 256 
and id no in 
(select id from table1 where date1 < eDate1 and zId = 256) 

MonetDBで、私が前に見てきたID番号を除外しようとしていますがありません。

もっと良い方法がありますか、選択した期間前にゾーン内に表示されたID番号を除外しようとしていますか?

ありがとうございました。

+0

を:

最善のアプローチは、参加して、フィルタミスに左を使用することですか? –

+0

「良い方法」?あなたの質問は不明です。 –

+0

パフォーマンスが向上し、クエリが高速になりました。申し訳ありませんが、ゴードンは不明です。 – flavour404

答えて

0

一部のデータベースオプティマイザは大きなIDリストを処理できますが、他のものはうまく処理できません。あなたが使用しているDBMS

select a.id 
from table1 a 
left join table1 b on a.id = b.id and b.date1 < eDate1 
where a.date1 between eDate1 and eDate2 
and zId = 256 
and b.id is null 
+0

私はこれを読んで、「それはLEFT JOIN/IS NULLクエリが810ミリ秒、すなわちNOT EXISTS/NOT INクエリの3倍の時間を要する理由です。 https://explainextended.com/2009/09/15/not-in-vs-not-exists-vs-left-join-is-null-sql-server/ – flavour404

+0

@flavour404は、リストのサイズによって異なります。それが大きければ、このクエリはより速くなるはずです。また、 'id'カラムにインデックスが必要であることに注意してください – Bohemian

関連する問題