IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage SQL Discussion :

clause NOT IN


Sujet :

Langage SQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 13
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  2. #2
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Par défaut
    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 ?

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 13
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  4. #4
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    C'est probablement à cause des nulls.
    Essayez ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 13
    Par défaut
    ah oui!!! merci beaucoup
    ça doit bien être ça à cause des valeurs nulles

    les deux requêtes fonctionnent

    merci beaucoup

  6. #6
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    22 010
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 22 010
    Billets dans le blog
    6
    Par défaut
    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
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Probleme clause NOT EXISTS et NOT IN
    Par Jarod51 dans le forum Langage SQL
    Réponses: 7
    Dernier message: 12/07/2010, 08h42
  2. Clause not in
    Par tianet dans le forum Requêtes
    Réponses: 2
    Dernier message: 31/08/2007, 14h16
  3. Ora-30051 VERSIONS clause not allowed here
    Par big1 dans le forum Administration
    Réponses: 6
    Dernier message: 13/02/2007, 14h35
  4. [Oracle 9i] Optimisation clause not exists
    Par mjolymelot dans le forum Langage SQL
    Réponses: 7
    Dernier message: 23/08/2006, 17h20
  5. Clause "Not IN"
    Par gonado dans le forum Requêtes
    Réponses: 11
    Dernier message: 04/05/2006, 11h48

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo