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 :

Problème: Requête utilisant NOT IN


Sujet :

Langage SQL

  1. #1
    Nouveau membre du Club
    Inscrit en
    Mars 2004
    Messages
    37
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 37
    Points : 28
    Points
    28
    Par défaut Problème: Requête utilisant NOT IN
    Bonjour,

    Je n'arrive pas à obtenir le bon résultat pour ma requête :

    J'ai une table TA01 qui contient en autre :
    - idTA01 : clé primaire
    - idProduit
    - idTechno
    - idAppli

    et une autre TAK qui contient entre autre :
    - idTAK : clé primaire
    - idProduit
    - idTechno
    - idAppli

    J'aimerais récupérer la liste des enregistrements de TA01 où le triplet (idProduit, idTechno et idAppli) ne sont pas présent dans TAK (n'ont pas d'idTAK).

    J'ai essayé cette requette mais elle ne renvoie pas le bon résultat :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT TA01.idProduit, TA01.idTechno, TA01.idAppli FROM TA01
    WHERE TA01.idProduit NOT IN (SELECT TAK.idProduit FROM TAK) AND
          TA01.idTechno  NOT IN (SELECT TAK.idTechno  FROM TAK) AND
          TA01.idAppli   NOT IN (SELECT TAK.idAppli   FROM TAK);
    Il faudrait pouvoir faire quelque chose comme ce qui suit, mais la requête est incorrecte :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    SELECT TA01.idProduit, TA01.idTechno, TA01.idAppli FROM TA01
    WHERE (TA01.idProduit, TA01.idTechno, TA01.idAppli NOT IN (SELECT TAK.idProduit, TAK.idTechno, TAK.idAppli FROM TAK);

    Merci de votre aide.

  2. #2
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT TA01.idProduit, TA01.idTechno, TA01.idAppli FROM TA01 
    WHERE NOT EXISTS (SELECT 1
    FROM TAK
    WHERE TA01.idProduit = TAK.idProduit 
    AND     TA01.idTechno = TAK.idTechno  
    AND     TA01.idAppli    = TAK.idAppli);
    Sans précision sur le SGBD tel que demandé dans les régles du forum, je ne peux pas te garantir que la syntaxe est correcte

  3. #3
    Nouveau membre du Club
    Inscrit en
    Mars 2004
    Messages
    37
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 37
    Points : 28
    Points
    28
    Par défaut
    Merci pour tout,
    ta requête fonctionne très bien.

    Sans précision sur le SGBD tel que demandé dans les régles du forum, je ne peux pas te garantir que la syntaxe est correcte
    Je travaillais au fait sous access

  4. #4
    Membre du Club
    Inscrit en
    Avril 2004
    Messages
    54
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 54
    Points : 65
    Points
    65
    Par défaut
    Une autre façon de faire qui devrait etre plus performante en temps de réponse (selection ONE SHOT, pas d'itération sur TAK).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    SELECT 
               TA01.idProduit, TA01.idTechno, TA01.idAppli 
    FROM 
              TA01
      LEFT outer join 
              TAK
      ON
               TA01.idProduit = TAK.idProduit  and 
               TA01.idTechno = TAK.idTechno  and  
               TA01.idAppli    = TAK.idAppli)
    Where
               TAK.idProduit is NULL
                ;

  5. #5
    Nouveau membre du Club
    Inscrit en
    Mars 2004
    Messages
    37
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 37
    Points : 28
    Points
    28
    Par défaut
    J'ai essayé ta requête, elle marche tout aussi bien. Je n'ai pas vu en terme de performance la différence car je testais sur peu de données.

    Merci à tout le monde pour votre aide.

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

Discussions similaires

  1. Problème requête NOT EXISTS
    Par jbulysse dans le forum SQL
    Réponses: 3
    Dernier message: 04/08/2008, 12h22
  2. Réponses: 10
    Dernier message: 14/06/2008, 21h16
  3. problème d'utilisation du résultat de ma requête
    Par ph_anrys dans le forum Langage
    Réponses: 5
    Dernier message: 13/03/2006, 12h22
  4. Optimiser requête utilisant NOT IN
    Par Neilos dans le forum Langage SQL
    Réponses: 5
    Dernier message: 11/08/2005, 15h24

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