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 :

Doute sur une requête NOT EXISTS


Sujet :

Langage SQL

  1. #1
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 048
    Points
    34 048
    Billets dans le blog
    14
    Par défaut Doute sur une requête NOT EXISTS
    Bonjour,
    Je cherche les bovins :
    - actifs (B_Actif = 1) ;
    - femelle (B_SEXE = '2') ;
    - qui ont une date de premier vêlage (B_DAT_PREM_VELAGE IS NOT NULL) ;
    - et qui ne sont pas mère d'un autre bovin de la même table (c'est là que j'ai un doute dans les requêtes ci-dessous ).

    La mère d'un bovin est donné par l'identifiant du bovin mère dans la colonne B_FK_IND_MERE.

    J'ai d'abord fait une jointure externe gauche et cherché les NULL dans la deuxième instance de la table :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT b1.B_IND_BOVIN, b1.B_NUM_NAT, b1.B_DAT_NAISS, b1.B_FK_COD_TEMOIN_NAISS, b1.B_DAT_PREM_VELAGE
    FROM bdni2.bovins b1
    LEFT OUTER JOIN bdni2.bovins b2 ON b1.B_IND_BOVIN = b2.B_FK_IND_MERE
    WHERE b1.B_Actif = 1
      AND b1.B_SEXE = '2'
      AND b1.B_DAT_PREM_VELAGE IS NOT NULL
      AND b2.B_IND_BOVIN IS NULL
    Résultat : 14 323 926 vaches !

    Devant l'énormité de ce résultat, j'ai essayé avec la méthode NOT EXISTS :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT b1.B_IND_BOVIN, b1.B_NUM_NAT, b1.B_DAT_NAISS, b1.B_FK_COD_TEMOIN_NAISS, b1.B_DAT_PREM_VELAGE
    FROM bdni2.bovins b1
    WHERE b1.B_Actif = 1
      AND b1.B_SEXE = '2'
      AND b1.B_DAT_PREM_VELAGE IS NOT NULL
      AND NOT EXISTS (
        SELECT *
        FROM bdni2.bovins b2
        WHERE b1.B_IND_BOVIN = b2.B_FK_IND_MERE)
    Résultat : 14 323 926 vaches ! Idem.

    Avant d'annoncer ce résultat étonnant au thésard qui étudie les méthodes d'élevage bovin, je voudrais être sûr de ne pas avoir mal construit ma requête.

    Merci de me donner votre avis sur ce sujet.

  2. #2
    Membre expérimenté
    Avatar de jbrasselet
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Mars 2006
    Messages
    1 022
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 022
    Points : 1 413
    Points
    1 413
    Par défaut
    Pour moi ça me semble bon à première vue.

  3. #3
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    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 453
    Points : 18 386
    Points
    18 386
    Par défaut
    Pareillement, les deux requêtes sont correctes.

  4. #4
    Rédacteur
    Avatar de jsd03
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Août 2008
    Messages
    1 221
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

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

    Informations forums :
    Inscription : Août 2008
    Messages : 1 221
    Points : 6 506
    Points
    6 506
    Par défaut
    Et si tu remplaces

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    AND NOT EXISTS (
        SELECT *
        FROM bdni2.bovins b2
        WHERE b1.B_IND_BOVIN = b2.B_FK_IND_MERE)
    Par

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    AND b1.B_IND_BOVIN NOT IN (
        SELECT b2.B_IND_BOVIN
        FROM bdni2.bovins b2
        WHERE b1.B_IND_BOVIN = b2.B_FK_IND_MERE)

  5. #5
    Membre expérimenté
    Avatar de jbrasselet
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Mars 2006
    Messages
    1 022
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 022
    Points : 1 413
    Points
    1 413
    Par défaut
    Les deux syntaxes sont équivalents en terme de résultats normalement.
    Par contre le NOT IN est me semble-t-il plus lent

  6. #6
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 048
    Points
    34 048
    Billets dans le blog
    14
    Par défaut
    Bon j'ai trouvé pourquoi j'avais un résultat si énorme.
    Ma requête d'interrogation était bonne mais c'était la requête UPDATE qui alimentait la clé étrangère qui ne l'était pas.

    Comme cette alimentation venait de trois tables différentes, la deuxième fois que j'ai lancé la requête UPDATE, ça a mis à NULL (valeur par défaut) toutes les lignes qui n'étaient pas concernées par la mise à jour et idem à la troisième fois !

    J'ai corrigé ma requête UPDATE, ai relancé mes trois opérations et tous les veaux ont retrouvé leur mère.

    Et ma requête SELECT me donne maintenant un résultat beaucoup plus correct.

    Merci de m'avoir donné votre avis.

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

Discussions similaires

  1. Aide sur une requête (Group By...??)
    Par Cocolapin dans le forum Langage SQL
    Réponses: 4
    Dernier message: 12/12/2004, 10h26
  2. [Access] Manque d'idées sur une requête
    Par portu dans le forum Langage SQL
    Réponses: 12
    Dernier message: 22/11/2004, 12h25
  3. Pb sur une requête SQL (de champ vide)
    Par Marion dans le forum Langage SQL
    Réponses: 3
    Dernier message: 01/07/2004, 11h12
  4. Problème sur une requête INSERT
    Par Marion dans le forum Langage SQL
    Réponses: 3
    Dernier message: 17/06/2003, 08h45
  5. problème sur une requête!!!!!
    Par Mcgrady_01 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 13/06/2003, 01h17

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