NOT IN
クエリと NULL 値のトラブルシューティング
サブセットに存在しないレコードを検索するためにデータベースにクエリを実行する場合、NOT IN
を使用すると、予期しない空の結果が返される可能性があります。 これは、サブクエリに NULL 値が含まれている場合によく発生します。
問題: NOT IN
と NULL
[Inventory].[dbo].[Stock]
に存在しないレコードを [Subset].[dbo].[Products]
から取得するように設計された次の SQL クエリについて考えてみましょう。
<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>
foreignStockId
に NULL が含まれている場合、一致するものが存在する場合でも、このクエリは行を返さない場合があります。 これは SQL の 3 値ロジックによるものです。 NULL との比較の結果は UNKNOWN
となり、NOT IN
の評価に影響します。
解決策: NULL の処理
この問題を回避する 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
を 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 を処理する場合にパフォーマンスの向上につながる可能性があります。
さらに読む:
LEFT JOIN
やその他の代替案を含む、この問題に対するさまざまなアプローチの詳細な比較については、次のリソースを参照してください。
以上がNULL 値が存在すると SQL「NOT IN」クエリが失敗するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。