ホームページ > データベース > mysql チュートリアル > NULL 値が存在すると SQL「NOT IN」クエリが失敗するのはなぜですか?

NULL 値が存在すると SQL「NOT IN」クエリが失敗するのはなぜですか?

DDD
リリース: 2025-01-18 11:26:12
オリジナル
817 人が閲覧しました

Why Do My SQL `NOT IN` Queries Fail When NULL Values Are Present?

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 つの効果的な解決策:

  1. サブクエリからの NULL のフィルタリング: IS NOT NULL:
  2. を使用して 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 の使用: より効率的で明確なアプローチになる可能性があるため、NOT INNOT 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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート