SQL NOT IN
演算子: 予想される値と実際の値
SQL の NOT IN
演算子には、多くの場合課題があります。この記事では、NOT IN
の期待される機能が失敗すると思われるシナリオを調査し、問題を分析し、代替案を提供します。
2 つのデータベースがあり、1 つは主要な在庫を含み、もう 1 つはこれらのレコードのサブセットを含むとします。 NOT IN
を使用したクエリは、次の 2 つのデータベース間の違いを見つけようとします:
<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 値が検出された場合、NOT IN
クエリは NULL と評価され、それらのレコードは除外されます。この動作は、述語が True、False、または Unknown を返すことができる SQL で使用される 3 値のロジックに起因します。
この問題を解決するには、次の 2 つの代替案が考えられます。
IS NOT 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>
NOT EXISTS
の代わりに NOT IN
を使用します:
<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>
どちらのメソッドも NULL 値を効率的に処理し、有効な比較のみが行われるようにします。 NOT EXISTS
を使用した後者のアプローチでは、通常、実行計画が簡素化され、パフォーマンスが向上します。
SQL で NULL 値を扱うときは、常に 3 値のロジックを考慮し、予期しない結果を避けるために適切な手法を使用してください。
以上がSQL「NOT IN」クエリが予期しない結果を返すのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。