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
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>
offre généralement de meilleures performances en simplifiant le plan d'exécution. NOT EXISTS
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!