Maison >base de données >tutoriel mysql >Pourquoi ma requête SQL « NOT IN » renvoie-t-elle des résultats inattendus ?

Pourquoi ma requête SQL « NOT IN » renvoie-t-elle des résultats inattendus ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2025-01-18 11:41:17782parcourir

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

SQL NOT IN Opérateurs : attendus ou réels

L'opérateur NOT IN en SQL présente souvent des défis. Cet article explore un scénario dans lequel la NOT IN fonctionnalité attendue semble échouer, analyse le problème et propose des alternatives.

Supposons qu'il existe deux bases de données, l'une contenant l'inventaire principal et l'autre contenant un sous-ensemble de ces enregistrements. Une requête utilisant NOT IN tente de trouver les différences entre ces deux bases de données :

<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>

Cependant, cette requête n'a pas réussi à fournir les résultats attendus. Il exclut tous les enregistrements, même s'ils existent dans la base de données du sous-ensemble. Le manque de données soulève la question : « Qu’est-ce qui n’a pas fonctionné ? »

La réponse réside dans la possibilité de valeurs NULL dans la base de données du sous-ensemble. Lorsqu'une valeur NULL est rencontrée, la requête

sera évaluée à NULL, entraînant l'exclusion de ces enregistrements. Ce comportement découle de la logique à trois valeurs utilisée par SQL, où les prédicats peuvent renvoyer True, False ou Unknown. NOT IN

Pour corriger ce problème, deux alternatives peuvent être envisagées :

Utiliser  : 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>

Utilisez au lieu de 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>
Les deux méthodes gèrent efficacement les valeurs NULL, garantissant que seules des comparaisons valides sont effectuées. Cette dernière approche utilisant

offre généralement de meilleures performances en simplifiant le plan d'exécution. NOT EXISTS

N'oubliez pas que lorsque vous traitez des valeurs NULL dans SQL, tenez toujours compte de la logique à trois valeurs et utilisez des techniques appropriées pour éviter des résultats inattendus.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn