OVH Cloud OVH Cloud

difference entre not in ... in et not in ?

7 réponses
Avatar
coolben
Bonjour
j'utilise une base SQL server 2000.
je ne comprend pas pourquoi lorsque je lance une requete de selections avec
une clause not in (select ...), cette clause ne fonctionne pas correctement.
je doit utilise une requete aavec deux selects
l'exemple est plus parlant :
voici deux requetes normalement sempbables mais qui retournent deux
resultats differents

select count(*) from log where code not in (select code from personne)
select count(*) from log where code not in (select code from log where code
in (select code from personne))
reponse :
0
2500
cordialement,

7 réponses

Avatar
Sylvain Lafontaine
Tous les codes possibles sont retournés dans la sous-requête du premier
exemple; il ne reste donc rien à lire et le résultat final est 0.

Dans le deuxième cas, vous avez la négation d'une negation, ce qui revient à
retourner tous les résultats possibles du log.

Vous devriez expliciter davantage la structure ainsi que le contenu de vos
tables et indiquez ce que vous voulez obtenir comme résultat si vous voulez
avoir une réponse adéquate à votre question.

--
Sylvain Lafontaine, ing.
MVP - Technologies Virtual-PC


"coolben" wrote in message
news:
Bonjour
j'utilise une base SQL server 2000.
je ne comprend pas pourquoi lorsque je lance une requete de selections
avec
une clause not in (select ...), cette clause ne fonctionne pas
correctement.
je doit utilise une requete aavec deux selects
l'exemple est plus parlant :
voici deux requetes normalement sempbables mais qui retournent deux
resultats differents

select count(*) from log where code not in (select code from personne)
select count(*) from log where code not in (select code from log where
code
in (select code from personne))
reponse :
0
2500
cordialement,



Avatar
coolben
merci de la reponse aussi rapide mais la deuxieme requete ne compte pas toute
la table car elle fait 80 000 tuples.

de plus dans tout les cas je n'utilise qu'une seule negation

que voulez vous que j'explique plus ?

"Sylvain Lafontaine" a écrit :

Tous les codes possibles sont retournés dans la sous-requête du premier
exemple; il ne reste donc rien à lire et le résultat final est 0.

Dans le deuxième cas, vous avez la négation d'une negation, ce qui revient à
retourner tous les résultats possibles du log.

Vous devriez expliciter davantage la structure ainsi que le contenu de vos
tables et indiquez ce que vous voulez obtenir comme résultat si vous voulez
avoir une réponse adéquate à votre question.

--
Sylvain Lafontaine, ing.
MVP - Technologies Virtual-PC


"coolben" wrote in message
news:
> Bonjour
> j'utilise une base SQL server 2000.
> je ne comprend pas pourquoi lorsque je lance une requete de selections
> avec
> une clause not in (select ...), cette clause ne fonctionne pas
> correctement.
> je doit utilise une requete aavec deux selects
> l'exemple est plus parlant :
> voici deux requetes normalement sempbables mais qui retournent deux
> resultats differents
>
> select count(*) from log where code not in (select code from personne)
> select count(*) from log where code not in (select code from log where
> code
> in (select code from personne))
> reponse :
> 0
> 2500
> cordialement,
>





Avatar
Sylvain Lafontaine
Dire que vous avez 80000 enregistrements au lieu de 2500, c'est déjà un bon
début.

Un problème fréquent avec IN est la présence de valeur Nulles. Si
nécessaire, ajouter le critère « where personne.code is not null » dans vos
sous-requêtes.

Si code est alphanumérique, vous avez peut-être également des problèmes de
casse (Majuscules vs minuscules).

Par double-négation, c'était une description succincte des deux
sous-requêtes imbriquées dans votre deuxième exemple. Cependant, comme je
ne connais pas la relation exacte du champ Code entre ces deux tables et sa
distribution interne, il m'est impossible d'évaluer le résultat final.

--
Sylvain Lafontaine, ing.
MVP - Technologies Virtual-PC


"coolben" wrote in message
news:
merci de la reponse aussi rapide mais la deuxieme requete ne compte pas
toute
la table car elle fait 80 000 tuples.

de plus dans tout les cas je n'utilise qu'une seule negation

que voulez vous que j'explique plus ?

"Sylvain Lafontaine" a écrit :

Tous les codes possibles sont retournés dans la sous-requête du premier
exemple; il ne reste donc rien à lire et le résultat final est 0.

Dans le deuxième cas, vous avez la négation d'une negation, ce qui
revient à
retourner tous les résultats possibles du log.

Vous devriez expliciter davantage la structure ainsi que le contenu de
vos
tables et indiquez ce que vous voulez obtenir comme résultat si vous
voulez
avoir une réponse adéquate à votre question.

--
Sylvain Lafontaine, ing.
MVP - Technologies Virtual-PC


"coolben" wrote in message
news:
> Bonjour
> j'utilise une base SQL server 2000.
> je ne comprend pas pourquoi lorsque je lance une requete de selections
> avec
> une clause not in (select ...), cette clause ne fonctionne pas
> correctement.
> je doit utilise une requete aavec deux selects
> l'exemple est plus parlant :
> voici deux requetes normalement sempbables mais qui retournent deux
> resultats differents
>
> select count(*) from log where code not in (select code from personne)
> select count(*) from log where code not in (select code from log where
> code
> in (select code from personne))
> reponse :
> 0
> 2500
> cordialement,
>







Avatar
Patrice
Le début des deux requêtes étant identique, essaie de comparer :
- select code from personne
- select code from log where code in (select code from personne)

(éventuellement avec un DISTINCT)

Le résultat est-il identique ?

Patrice

--

"coolben" a écrit dans le message de
news:
merci de la reponse aussi rapide mais la deuxieme requete ne compte pas


toute
la table car elle fait 80 000 tuples.

de plus dans tout les cas je n'utilise qu'une seule negation

que voulez vous que j'explique plus ?

"Sylvain Lafontaine" a écrit :

> Tous les codes possibles sont retournés dans la sous-requête du premier
> exemple; il ne reste donc rien à lire et le résultat final est 0.
>
> Dans le deuxième cas, vous avez la négation d'une negation, ce qui


revient à
> retourner tous les résultats possibles du log.
>
> Vous devriez expliciter davantage la structure ainsi que le contenu de


vos
> tables et indiquez ce que vous voulez obtenir comme résultat si vous


voulez
> avoir une réponse adéquate à votre question.
>
> --
> Sylvain Lafontaine, ing.
> MVP - Technologies Virtual-PC
>
>
> "coolben" wrote in message
> news:
> > Bonjour
> > j'utilise une base SQL server 2000.
> > je ne comprend pas pourquoi lorsque je lance une requete de selections
> > avec
> > une clause not in (select ...), cette clause ne fonctionne pas
> > correctement.
> > je doit utilise une requete aavec deux selects
> > l'exemple est plus parlant :
> > voici deux requetes normalement sempbables mais qui retournent deux
> > resultats differents
> >
> > select count(*) from log where code not in (select code from personne)
> > select count(*) from log where code not in (select code from log where
> > code
> > in (select code from personne))
> > reponse :
> > 0
> > 2500
> > cordialement,
> >
>
>
>


Avatar
coolben
Ces deux requetes ne m'aporte pas grand chose
la table personne regroupe plus de 200 000 tuple.
la premiere requete m'affiche bien plus de code qu'il y a dans la table log
la deuxieme requete m'affiche environ 74 000 tuple ce qui est normal

par contre je pense que cela est lié a une cause null manquant. je vais voir
merci pour votyre aide

"Patrice" a écrit :

Le début des deux requêtes étant identique, essaie de comparer :
- select code from personne
- select code from log where code in (select code from personne)

(éventuellement avec un DISTINCT)

Le résultat est-il identique ?

Patrice

--

"coolben" a écrit dans le message de
news:
> merci de la reponse aussi rapide mais la deuxieme requete ne compte pas
toute
> la table car elle fait 80 000 tuples.
>
> de plus dans tout les cas je n'utilise qu'une seule negation
>
> que voulez vous que j'explique plus ?
>
> "Sylvain Lafontaine" a écrit :
>
> > Tous les codes possibles sont retournés dans la sous-requête du premier
> > exemple; il ne reste donc rien à lire et le résultat final est 0.
> >
> > Dans le deuxième cas, vous avez la négation d'une negation, ce qui
revient à
> > retourner tous les résultats possibles du log.
> >
> > Vous devriez expliciter davantage la structure ainsi que le contenu de
vos
> > tables et indiquez ce que vous voulez obtenir comme résultat si vous
voulez
> > avoir une réponse adéquate à votre question.
> >
> > --
> > Sylvain Lafontaine, ing.
> > MVP - Technologies Virtual-PC
> >
> >
> > "coolben" wrote in message
> > news:
> > > Bonjour
> > > j'utilise une base SQL server 2000.
> > > je ne comprend pas pourquoi lorsque je lance une requete de selections
> > > avec
> > > une clause not in (select ...), cette clause ne fonctionne pas
> > > correctement.
> > > je doit utilise une requete aavec deux selects
> > > l'exemple est plus parlant :
> > > voici deux requetes normalement sempbables mais qui retournent deux
> > > resultats differents
> > >
> > > select count(*) from log where code not in (select code from personne)
> > > select count(*) from log where code not in (select code from log where
> > > code
> > > in (select code from personne))
> > > reponse :
> > > 0
> > > 2500
> > > cordialement,
> > >
> >
> >
> >





Avatar
Patrice
J'ai l'impression que tu t'attendais à ce que tes deux requêtes originales
retournent la même chose.

Eventuellement, si le problème persiste, dis nous en français ce que tu
cherches comme résultat...

Patrice

--

"coolben" a écrit dans le message de
news:
Ces deux requetes ne m'aporte pas grand chose
la table personne regroupe plus de 200 000 tuple.
la premiere requete m'affiche bien plus de code qu'il y a dans la table


log
la deuxieme requete m'affiche environ 74 000 tuple ce qui est normal

par contre je pense que cela est lié a une cause null manquant. je vais


voir
merci pour votyre aide

"Patrice" a écrit :

> Le début des deux requêtes étant identique, essaie de comparer :
> - select code from personne
> - select code from log where code in (select code from personne)
>
> (éventuellement avec un DISTINCT)
>
> Le résultat est-il identique ?
>
> Patrice
>
> --
>
> "coolben" a écrit dans le message de
> news:
> > merci de la reponse aussi rapide mais la deuxieme requete ne compte


pas
> toute
> > la table car elle fait 80 000 tuples.
> >
> > de plus dans tout les cas je n'utilise qu'une seule negation
> >
> > que voulez vous que j'explique plus ?
> >
> > "Sylvain Lafontaine" a écrit :
> >
> > > Tous les codes possibles sont retournés dans la sous-requête du


premier
> > > exemple; il ne reste donc rien à lire et le résultat final est 0.
> > >
> > > Dans le deuxième cas, vous avez la négation d'une negation, ce qui
> revient à
> > > retourner tous les résultats possibles du log.
> > >
> > > Vous devriez expliciter davantage la structure ainsi que le contenu


de
> vos
> > > tables et indiquez ce que vous voulez obtenir comme résultat si vous
> voulez
> > > avoir une réponse adéquate à votre question.
> > >
> > > --
> > > Sylvain Lafontaine, ing.
> > > MVP - Technologies Virtual-PC
> > >
> > >
> > > "coolben" wrote in message
> > > news:
> > > > Bonjour
> > > > j'utilise une base SQL server 2000.
> > > > je ne comprend pas pourquoi lorsque je lance une requete de


selections
> > > > avec
> > > > une clause not in (select ...), cette clause ne fonctionne pas
> > > > correctement.
> > > > je doit utilise une requete aavec deux selects
> > > > l'exemple est plus parlant :
> > > > voici deux requetes normalement sempbables mais qui retournent


deux
> > > > resultats differents
> > > >
> > > > select count(*) from log where code not in (select code from


personne)
> > > > select count(*) from log where code not in (select code from log


where
> > > > code
> > > > in (select code from personne))
> > > > reponse :
> > > > 0
> > > > 2500
> > > > cordialement,
> > > >
> > >
> > >
> > >
>
>
>


Avatar
Steve Kass
Comme Sylvain nous a expliqué, si le filtre est NOT IN ...,
il y a la question des nulles dans la sous-requête. Dans
ce cas, NULL est considéré comme "valeur inconnue",
donc la vérité de X NOT IN ( contient NULL/inconnue,
mais aucune valeur X ) reste incertain.

create table personne (
code int
)
create table plog (
code int
)
insert into personne values (1)
insert into personne values (2)
insert into plog values (1)
insert into plog values (null)

select code from personne
where code not in (
select code from plog
)

select code from personne
where code not in (
select code from plog
where code is not null
)

Steve Kass
Drew University

Patrice wrote:

Le début des deux requêtes étant identique, essaie de comparer :
- select code from personne
- select code from log where code in (select code from personne)

(éventuellement avec un DISTINCT)

Le résultat est-il identique ?

Patrice