Précédent   Forum des professionnels en informatique > Bases de données > MS SQL-Server > Développement
Développement Forum d'entraide sur le Transact-SQL, le CLR, les procédures stockées, les triggers, les requêtes SQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 15/03/2011, 18h56   #1
Membre chevronné
 
Avatar de alassanediakite
 
Homme Alassane Diakité
Conseil - Consultant en systèmes d'information
Inscription : août 2006
Messages : 539
Détails du profil
Informations personnelles :
Nom : Homme Alassane Diakité
Âge : 34
Localisation : Mali

Informations professionnelles :
Activité : Conseil - Consultant en systèmes d'information

Informations forums :
Inscription : août 2006
Messages : 539
Points : 604
Points : 604
Envoyer un message via Yahoo à alassanediakite
Par défaut resultat inattendu de "not in avec s/requête"

Salut
Voici une table:
Code :
1
2
3
4
5
 
tpersonne(idpersonne int identity PRIMARY KEY,
idpere int FOREIGN KEY REFERENCES tpersonne(idpersonne), --le père en auto jointure
idmere int FOREIGN KEY REFERENCES tpersonne(idpersonne),--la mère en auto jointure 
prenom varchar(20), prenom varchar(20))
Nous avons copier/coller des données depuis une table access. Il existe des personnes avec parents renseignés.
Nous voulons chercher les personnes n'ayant pas d'enfant. voici la requête:
Code :
1
2
3
4
5
 
SELECT idpersonne, prenom, nom 
   FROM tpersonne
WHERE idpersonne NOT IN
(SELECT idpere FROM tpersonne AS papa union ALL SELECT idmere FROM tpersonne AS maman)
...elle ne marche que si on remplace...
Code :
1
2
 
idpere et idmere par isnull(idpere,0) et isnull(idmere,0)
...dans les sous-requêtes.
Je voudrais comprendre pourquoi ce comportement? sachant que...
Code :
1
2
 
SELECT idpere FROM tpersonne AS papa union ALL SELECT idmere FROM tpersonne AS maman
...pris à part donne bien des données.
Merci d'avance
__________________
Le monde est trop bien programmé pour être l’œuvre du hasard…
alassanediakite est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/03/2011, 19h30   #2
Modérateur
 
Homme Fabien
Ingénieur d'études en décisionnel
Inscription : septembre 2008
Messages : 5 684
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Âge : 34
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études en décisionnel
Secteur : Arts - Culture

Informations forums :
Inscription : septembre 2008
Messages : 5 684
Points : 10 459
Points : 10 459
Envoyer un message via ICQ à Waldar Envoyer un message via Skype™ à Waldar
Parce que vous devez avoir des NULL dans vos idpere et idmere, et que l'expression NOT IN (..., null) est toujours fausse.

Vous pouvez donc soit exclure les nulls lors de la sous-requête :
Code :
1
2
3
4
5
6
7
8
9
SELECT idpersonne, prenom, nom 
  FROM tpersonne
 WHERE idpersonne NOT IN (SELECT idpere
                            FROM tpersonne AS papa
                           WHERE idpere IS NOT NULL
                           union ALL
                          SELECT idmere
                            FROM tpersonne AS maman
                           WHERE idmere IS NOT NULL)
Soit préférer une requête de non-existence (qui se rapproche plus de votre besoin) :
Code :
1
2
3
4
5
SELECT per.idpersonne, per.prenom, per.nom 
  FROM tpersonne AS per
 WHERE NOT EXISTS (SELECT NULL
                     FROM tpersonne AS par
                    WHERE per.idpersonne IN (par.idpere, par.idmere))
__________________
Email : http://scr.im/waldar
Waldar est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/03/2011, 11h18   #3
Membre chevronné
 
Avatar de alassanediakite
 
Homme Alassane Diakité
Conseil - Consultant en systèmes d'information
Inscription : août 2006
Messages : 539
Détails du profil
Informations personnelles :
Nom : Homme Alassane Diakité
Âge : 34
Localisation : Mali

Informations professionnelles :
Activité : Conseil - Consultant en systèmes d'information

Informations forums :
Inscription : août 2006
Messages : 539
Points : 604
Points : 604
Envoyer un message via Yahoo à alassanediakite
Merci
C'est bien ce que je soupçonnait. Mais dan le doute...
__________________
Le monde est trop bien programmé pour être l’œuvre du hasard…
alassanediakite est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 18h51.


 
 
 
 
Partenaires

Hébergement Web