ホームページ >データベース >mysql チュートリアル >SQL の「NOT IN」句が予期した結果を返さないのはなぜですか?

SQL の「NOT IN」句が予期した結果を返さないのはなぜですか?

Barbara Streisand
Barbara Streisandオリジナル
2025-01-18 11:36:09463ブラウズ

Why Does My SQL `NOT IN` Clause Fail to Return Expected Results?

SQL の NOT IN 句のトラブルシューティング: 失敗する理由と修正方法

SQL の NOT IN 句は、あるテーブルから、別のテーブルに 存在しない 行を選択するように設計されています。 ただし、特に NULL 値を処理する場合、予期しない動作が発生する可能性があります。

この問題のあるクエリを分析してみましょう:

<code class="language-sql">SELECT stock.IdStock, stock.Descr
FROM [Inventory].[dbo].[Stock] stock
WHERE stock.IdStock NOT IN (SELECT foreignStockId FROM [Subset].[dbo].[Products])</code>

このクエリは、特定のレコードを除外する必要がある場合でも、結果を返さない場合があります。

根本原因: NULL 価値観

問題は、NULL テーブルの foreignStockId 列の Products 値に起因します。 SQL の NOT IN 演算子は、NULL に対して予期しない動作をします。 NULL を含む比較は常に UNKNOWN という結果になり、これが WHERE 節の全体的なブール論理に影響します。

効果的な解決策:

これを修正するための信頼できる方法は 2 つあります:

  1. NULL の除外: NULL 値を明示的に除外するようにサブクエリを変更します:
<code class="language-sql">SELECT stock.IdStock, stock.Descr
FROM [Inventory].[dbo].[Stock] stock
WHERE stock.IdStock NOT IN (SELECT foreignStockId
                             FROM [Subset].[dbo].[Products]
                             WHERE foreignStockId IS NOT NULL)</code>
  1. NOT EXISTS の使用: この演算子は、より堅牢で、多くの場合、より効率的な代替手段を提供します。
<code class="language-sql">SELECT stock.idstock, stock.descr
FROM [Inventory].[dbo].[Stock] stock
WHERE NOT EXISTS (SELECT *
                   FROM [Subset].[dbo].[Products] p
                   WHERE p.foreignstockid = stock.idstock)</code>

NOT EXISTS は、一致する行が存在しないことを直接チェックし、NULL 比較の複雑さを回避します。

パフォーマンスの最適化:

どちらの解決策も正しいですが、パフォーマンスは異なる場合があります。 NOT EXISTS は一般に、特に大規模なデータセットの場合、よりシンプルで潜在的に高速な実行計画につながります。 ただし、foreignStockId 列に NULL 値がない場合は、NOT IN の方がパフォーマンスが若干向上する可能性があります。 最適なソリューションを決定するには、特定の環境で両方のアプローチをテストするのが最善です。

以上がSQL の「NOT IN」句が予期した結果を返さないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。