2017-12-15 16 views
1

このクエリを書き換えて、左の結合で 'not in'を削除しようとしていますが、自分自身を混乱させてしまいました。 (驚きませんなし)'not in'の代わりにSQLを使用する

オリジナルクエリ:

select parentfolderid from folderrelationships with (nolock) 
where childfolderid = 14908 
and parentfolderid not in (select folderid from folders with (nolock) where typeid in (153,155)) 

私の新しいバージョン:

select parentfolderid from folderrelationships fr with (nolock) 
LEFT JOIN folders f on f.FolderId = fr.ParentFolderID 
where childfolderid = 14908 AND f.TypeID in (153,155) 

が、私はすべての結果を取得しておりませんので..私はちょうどそれを取得しておりません。

私はこの問題は、 'TypeId in(153,155)in'をすべて考慮していると思います。それはどこに置くのか分かりません。

+2

軽度の迂回路... http://blogs.sqlsentry.com/aaronbertrand/bad-habits-nolock-everywhere/ –

答えて

3

NOT INをLEFT JOINとして書き換えるには、LEFT JOINの結果がNULLであることを確認する必要があります。

select parentfolderid from folderrelationships fr with (nolock) 
LEFT JOIN folders f on f.FolderId = fr.ParentFolderID AND f.TypeID in (153,155) 
where childfolderid = 14908 AND f.TypeID IS NULL 

LEFT JOINは条件を満たす行とそうでない行を取得します。あなたはフォルダテーブル(f.TypeID IS NULL - > TypeIdの代わりにPKを使用しますが、私はあなたのテーブル構造を知らない)から何も得ていないことをチェックしないようにするだけです。

一方、パフォーマンス上の問題のために書き直している場合は、これを実行することをお勧めしません。

0

結合は、通常、SQL式の高価な操作です。したがって、私は左の結合に変換しようとする前に "それについて考えてください"と警告する必要があります。しかし、なぜ単純な内部結合だけではなく、なぜ結合するのでしょうか?左/右ジョインは、一致するレコードを持たないものに対してNULL値を生成します。あなたのケースでは、一致するケースのみを探しているようです。

関連する問題