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

SQL「NOT IN」クエリが予期しない結果を返すのはなぜですか?

Mary-Kate Olsen
リリース: 2025-01-18 11:41:17
オリジナル
778 人が閲覧しました

Why Does My SQL `NOT IN` Query Return Unexpected Results?

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 サイトの他の関連記事を参照してください。

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