NOT EXISTS を使用することができます。上記のコードから行くだけでは、おそらくそうすべきではありませんが、技術的には可能です。原則として; 非常に小さく、迅速に解決されるセット (2 つのリテラルが確実に適用されます) は、NOT EXISTS よりも NOT IN の方が優れたパフォーマンスを発揮します。NOT EXISTS は、NOT EXISTS の相関サブクエリ (最初の一致で停止) がより迅速に解決されるように、各行に対して NOT IN が十分な比較を行う必要がある場合に優先されます。
これは、比較セットに NULL を含めることができないことを前提としています。それ以外の場合、NOT IN ( NULL, ...) は常に NULL を返し、したがって行がないため、NOT IN と NOT EXISTS は同じ結果を返しませんが、NOT EXISTS は一致が見つかった行を除外し、NULL は一致を生成しません。行を除外しません。
2 つのセットの不一致を比較する 3 つ目の方法は、OUTER JOIN を使用することです。これまでに得た情報からは、そのことに踏み込む理由がわかりません。
決定的な答えは、多くの変数に依存します(したがって、質問に対するコメントです)...
- publication_id 列のカーディナリティ (異なる値の数) は?
- 列に索引はありますか?
- テーブルには何行ありますか?
- NOT IN 句の値はどこで取得しましたか?
- それらは常にリテラルですか、それともパラメーターまたはサブクエリから取得されますか?
...ほんの数例を挙げると。もちろん、これを見つける最善の方法は、さまざまな方法でクエリを記述し、実行時間とクエリ プランを確認することです。
EDIT もう 1 つは、EXCEPT などの集合演算子を使用するものです。繰り返しますが、これに入るにはおそらくやり過ぎです。