Précédent   Forum des professionnels en informatique > Bases de données > Langage SQL
Langage SQL Forum d'entraide sur le langage SQL et sur les questions liées à la conception de schéma (DDL). Cours 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 02/03/2011, 13h07   #1
Invité de passage
 
Inscription : octobre 2007
Messages : 13
Détails du profil
Informations forums :
Inscription : octobre 2007
Messages : 13
Points : 2
Points : 2
Par défaut clause NOT IN

Bonjour j'ai un petit soucis avec une requête

j'ai une table intervenant avec des identifiants itv_id
et une table site_industriel qui a pour clé étrangère les itv_id de la table intervenant

voilà j'essaie d'exécuter cette requete:
Code :
select itv_id from intervenant where itv_id NOT IN(select itv_id from site_industriel)
le résultat => 0 lignes

alors que séparément
Code :
1
2
select itv_id from site_industriel => 25 lignes
select itv_id from intervenant => 61 000 lignes
(et j'ai vérifié j'ai à la main j'ai bien des itv_id dans la table intervenant qui ne sont pas dans la table site_industriel)

donc j'ai trouvé cette alternative:
Code :
select itv_id from intervenant where itv_id in(select itv_id from site_industriel)
qui pour moi est la même chose que select itv_id from site_industriel (confirmez moi svp)

et si j'execute cette requete
Code :
select * from intervenant where itv_id not in(select itv_id from intervenant where itv_id in(select itv_id from site_industriel))
la j'ai du résultat et le nombre est cohérent mais à mon sens c'est la même chose que
Code :
select itv_id from intervenant where itv_id NOT IN(select itv_id from site_industriel)
(confirmez moi svp)

alors est-ce que mes requêtes bleues sont fausses? je ne comprend pas pourquoi je suis obligée de faire un tel bricolage

merci d'avance pour votre aide
misseva3105 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/03/2011, 13h24   #2
Expert Confirmé
 
Homme
Inscription : mai 2002
Messages : 1 638
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 29
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : mai 2002
Messages : 1 638
Points : 2 630
Points : 2 630
Bonjour,

si vous avez fait exactement ce que vous avez dit, je penses qu'il y a un problème avec votre sgbd :p

Sinon, en reprenant la 1ere requete, si vous mettez un alias dans la sous-requete est-ce que cela fonctionne ?
punkoff est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/03/2011, 13h31   #3
Invité de passage
 
Inscription : octobre 2007
Messages : 13
Détails du profil
Informations forums :
Inscription : octobre 2007
Messages : 13
Points : 2
Points : 2
je viens de tester avec un alias ça ne marche pas non plus,
ce qui est bizarre c'est que j'ai une autre table interv_per qui est reliée à la table intervenant de la même façon que site_industriel est lié à intervenant (avec itv_id)
et là la requête

Code :
SELECT itv_id FROM intervenant WHERE itv_id NOT IN(SELECT itv_id FROM interv_per)
retourne bien un résultat cohérent

j'utilise postgresql
misseva3105 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/03/2011, 14h15   #4
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
C'est probablement à cause des nulls.
Essayez ceci :
Code :
1
2
3
4
5
SELECT itv_id
  FROM intervenant
 WHERE itv_id NOT IN (SELECT itv_id
                        FROM site_industriel
                       WHERE itv_id IS NOT NULL)
Ou cela :
Code :
1
2
3
4
5
SELECT it.itv_id
  FROM intervenant it
 WHERE NOT EXISTS (SELECT NULL
                     FROM site_industriel si
                    WHERE si.itv_id = it.itv_id)
Pour vos confirmations, non les requêtes que vous pensez équivalentes ne le sont pas du tout.
__________________
Email : http://scr.im/waldar
Waldar est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 02/03/2011, 14h23   #5
Invité de passage
 
Inscription : octobre 2007
Messages : 13
Détails du profil
Informations forums :
Inscription : octobre 2007
Messages : 13
Points : 2
Points : 2
ah oui!!! merci beaucoup
ça doit bien être ça à cause des valeurs nulles

les deux requêtes fonctionnent

merci beaucoup
misseva3105 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/03/2011, 15h08   #6
Rédacteur/Modérateur

 
Avatar de SQLpro
 
Homme Frédéric BROUARD
Expert SGBDR & SQL
Inscription : mai 2002
Messages : 10 950
Détails du profil
Informations personnelles :
Nom : Homme Frédéric BROUARD
Localisation : France

Informations professionnelles :
Activité : Expert SGBDR & SQL
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 10 950
Points : 17 769
Points : 17 769
Dès qu'il y a un NULL le NOT IN ne renvoie rien. Car NOT in (NULL) est toujours faux !

A +
__________________
Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
Site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
Blog SQL, SQL Server, modélisation données : http://blog.developpez.com/sqlpro
http://www.sqlspot.com : modélisation, conseils, audit, optimisation, formation
* * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * *
SQLpro 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 15h05.


 
 
 
 
Partenaires

Hébergement Web