J'ai parfois interchangé l'utilisation de pas dans code> et n'existe pas code> dans mes requêtes SQL et que les deux donnent le même résultat. La logique derrière le n'existe pas code> identique que pas dans code>? Parce que je pense que pas dans code> ... (est évalué comme "ou" à l'intérieur des sous-requêtes) est égal à n'existe pas code> (qui est également évalué comme "ou") ? Ou est-ce que je manque quelque chose? P>
4 Réponses :
Cet article peut vous intéresser: P>
en un mot, S'il n'y a pas de valeur pas dans code> est légèrement différent de n'existe pas code> dans la manière dont les deux poignées null code> sont renvoyées par la sous-requête. < / p>
NULL code>, ils effectuent tous les deux une sorte de type sur LOOP NETHED ANTIC Joindre code>, mais pas dans code> est un peu plus efficace. P>
Non, ils ne sont pas les mêmes. La fonction dans la fonction se traduit par une série de ou des déclarations. En règle générale, cela déclenche des gens lorsqu'ils utilisent une sous-requête dans la fonction dans la fonction et que la requête renvoie au moins une valeur null. Par exemple. existe simplement détermine si des lignes de la sous-requête sont retournées (non Existe d'être qu'aucune ligne de rangée ne peut être retournée). La clause SELECT est entièrement ignorée. p> Exemple: p> Col non dans (Sélectionnez FOO à partir de la barre) Code>. Cela compare col foo code> pour chaque ligne. Si l'une des valeurs de FOO est null, vous obtenez col null code> et la déclaration complète renvoie false résultant en aucune ligne.
Select Id
From Test
Where Not Exists( Select 1 From Bar Where Foo = Id )
Mais pourquoi le résultat est-il toujours le même?
Quand le résultat n'est-il pas le même?
@newbie - Non. Ils ne sont pas toujours les mêmes. Si dans notre exemple ci-dessus, il y a une valeur de FOO code> NULL, notre pas d'expression n'entraînera pas la requête externe qui ne renvoie aucune ligne de lignes. Toutefois, si nous utilisons une sous-requête corrélée à l'exist (par exemple, existe (sélectionnez * à partir de la barre où FOO = OUTERTABLECOL) CODE>), et l'une des valeurs de FOO est null et aucune valeur ne correspond à notre OUTERTABLECOL, La requête extérieure retournera des rangées.
@Newbie - J'ai élargi ma réponse pour illustrer la manière dont vous pourriez obtenir un résultat différent.
Les deux vous donneront les mêmes résultats. Il n'existe pas d'une sous-requête corrélée, elle est jointe à la requête principale. Dans l'exemple ci-dessous, il ne doit pas exister de fonctionner plus rapidement sur un grand jeu de données.
Rechercher des produits sans commandes. P>
select * from Products where ProductId NOT IN (select ProductId FROM Orders) select * from Products where NOT EXISTS (select 1 FROM Orders WHERE orders.ProductId = Products.Id)
Pas vrai si le produit contient des nuls.
@THOMAS - Bon point, merci de me rappeler la possibilité de null.
n'existe pas et pas en fonction de la même manière.
Par exemple: P>
SELECT Id FROM Test WHERE NOT EXISTS( SELECT foo FROM Bar WHERE Foo = Id );
Dupliqué possible de DÉFILE DIFFÉRENCE N'EST PAS INSIST