NOT EXISTSを使用することは可能です。上のコードからちょうど行くべきではないでしょうが、それは技術的に可能です。原則として、非常に小さく、迅速に解決されたセット(2つのリテラルが確実に適用されます)は、NOT INISISよりNOT INとして優れたパフォーマンスを発揮します。 NOT EXISTSは、NOT INIS(最初の一致で停止する)の相関サブクエリがより迅速に解決する各行に対して、NOT INが十分な比較を行う必要がある場合に勝ちます。
これは、比較セットにNULLを含めることができないことを前提としています。そうでなければ、NOT INとNOT EXISTSは同じ結果を返しません。NOT IN(NULL、...)は常にNULLを返します。したがって、NOT EXISTSは一致する行を除外し、NULLは一致を生成しません。行を除外しません。
ミスマッチの2つのセットを比較する第3の方法は、OUTER JOINです。私たちがこれまでに得たものからそれに入る理由は見当たらないので、今はそのものを手放すつもりです。
決定的な答えは、多くの変数に依存するであろう(あなたの質問に、したがってコメント)...
- publication_id列のカーディナリティ(異なる値の数)は何ですか?
- 列にインデックスがありますか?
- テーブルには何行ありますか?
- NOT IN句の値はどこから取得しましたか?
- これらは常にリテラルであるか、パラメータやサブクエリから来るのでしょうか?
...などです。もちろん、最適な方法は、クエリをさまざまな方法で記述し、実行時間とクエリ計画を調べることです。
EDITもう1つは、EXCEPTのようなセット演算子です。もう一度、おそらくそれに行き過ぎるだろう。
スキーマ?インデックス? RDBMS ...? –
RDBMSのみがうまくいきます...スキーマと索引付けはありません。最良の実装を探してください。 –
@MS:RBDMSを記述する必要があります。私はそれの状態を調べていませんでした! –