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 :

Requête peut être simple, mais compliquée pour moi !


Sujet :

Langage SQL

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 15
    Points : 8
    Points
    8
    Par défaut Requête peut être simple, mais compliquée pour moi !
    Salut à tous,

    J'ai trois table :
    TRAJET
    id

    ETAPE
    id
    id_trajet

    LISTE
    id_etape

    Un trajet a une ou plusieurs étapes
    Une étape est associé à 0 ou n liste.

    Je cherche à avoir un select qui compte les trajets dont toutes les étapes sont associées à au moins une liste.

    Ma requête est la suivante :
    Select count(t.id)
    from TRAJET t, ETAPE e, LISTE l
    where t.id=etape.id_trajet
    and etape.id in (select id_etape from LISTE)

    Le problème de cette requête est que si au moins une étape est associée à une Liste, elle est comprise dans mon count...
    Comment faire ?

    Par avance merci à tous,

    XFree

  2. #2
    Membre émérite

    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 683
    Points : 2 579
    Points
    2 579
    Par défaut
    Il te manque déjà un id dans la table LISTE qui devient :

    LISTE
    id
    id_etape


    Et la requête qui répond à "Les trajets pour lesquels aucune etape ne figure pas dans une liste" :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT * 
    FROM TRAJET
    WHERE NOT EXISTS (	SELECT * 
    			FROM ETAPE 
    			WHERE ETAPE.id_trajet = TRAJET.id 
    			AND NOT EXISTS (SELECT * 
    					FROM LISTE 
    					WHERE LISTE.id_etape = ETAPE.id_etape
    					)
    		)

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 15
    Points : 8
    Points
    8
    Par défaut
    Merci de ta réponse, mais cette requête ne correspond pas à mon besoin puisque le résultat est le même que la mienne.

    J'ai un trajet qui a 9 étapes, 8 sont associées à une liste, et ce trajet ressort dans le résultat.

    XFree

  4. #4
    Membre émérite

    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 683
    Points : 2 579
    Points
    2 579
    Par défaut
    Envoie les données du trajet qui pose problème pour voir.

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 15
    Points : 8
    Points
    8
    Par défaut
    TRAJET :
    ID
    ----
    569

    ETAPE :
    ID ID_TRAJET
    ----- ----------
    2571 569
    2578 569
    2612 569
    2647 569
    2663 569
    2683 569
    2688 569
    2696 569
    2699 569


    LISTE
    ID_ETAPE
    ---------
    2571
    2578
    2612
    2647
    2663
    2683
    2696
    2699

    Merci !

    XFree

  6. #6
    Membre émérite

    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 683
    Points : 2 579
    Points
    2 579
    Par défaut
    T'es sûr que tu l'avais testée ? Déjà il y avait une petite erreur sur un id que j'ai corrigée :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT *
    FROM TRAJET
    WHERE NOT Exists (SELECT * FROM ETAPE WHERE ETAPE.id_trajet = TRAJET.id AND NOT EXISTS (SELECT * FROM LISTE WHERE LISTE.id_etape = ETAPE.id));
    Et ca me renvoie le bon résultat

  7. #7
    Membre averti Avatar de AL1986
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    434
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 434
    Points : 441
    Points
    441
    Par défaut
    a vmolines
    J'ai du mal à comprendre ta requête (c'est surtout que je suis pas familier avec les not exists). Peux-tu expliquer un peu comment ils sont interprétés ? Merci.

  8. #8
    Membre émérite

    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 683
    Points : 2 579
    Points
    2 579
    Par défaut
    La clause EXISTS regarde simplement si le select entre parentheses renvoie des lignes (mes selects sont corrélés ici). C'est un peu comme un IN mais tu ne précises pas de colonne. C'est censé être plus rapide mais je n'ai pas fait de tests.

  9. #9
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 15
    Points : 8
    Points
    8
    Par défaut
    Je susi bien embêté, car malgré mes tests, je n'arrive toujours pas au résultat voulu... Je recherche avant de reposter ici...

    Merci en tout cas !

    XFree

  10. #10
    Membre émérite

    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 683
    Points : 2 579
    Points
    2 579
    Par défaut
    Moi le trajet ne ressortait pas. J'ai donc ajouté l'étape du trajet qui manquait dans la table LISTE et le trajet est bien ressorti.

    Donc soit tu fais mal tes tests, soit tu t'es trompé dans ce que tu as demandé comme résultat attendu, soit je n'ai pas bien compris.

  11. #11
    Membre averti Avatar de AL1986
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    434
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 434
    Points : 441
    Points
    441
    Par défaut
    A vmolines
    Si je comprends bien, ta requête selectionne les trajets si la deuxième requête ne renvoie aucune ligne.
    La dexième requête selectionne les étapes telle que ETAPE.id_trajet = TRAJET.id
    et que la troisième requête ne renvoie aucune ligne.
    La troisième requête selectionne les listes telle que la condition ...
    Est-ce que c'est ça ?
    Si oui, supposons que la troisième ne renvoie rien et donc la deuxième récupère les étapes concernant un certain trajet, si celle-ci ne renvoie rien, on récupère le trajet en question. Au final seuls les trajets n'étant pas présents dans la table ETAPE et dont les étapes ne sont pas dans LISTE seront selectionnés.
    Sinon, j'aimerai bien avoir des explications (ça commence à m'embrouiller). Merci.

  12. #12
    Membre confirmé
    Avatar de argoet
    Inscrit en
    Mai 2002
    Messages
    582
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 582
    Points : 562
    Points
    562
    Par défaut
    Peut etre quelque chose comme ça ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    --------------------------------------------------------------
    -- On Compte le nombre de trajet Different 
    --------------------------------------------------------------
    --  1 : Ayant au moins 1 etape dans la Liste (Jointure entre Etape liste)
    --  2 : Et dont aucune(not exists) des Etapes (du trajet en cours) 
    --       n'est(not in) présente dans la liste 
    --             ==> (Donc elle le sont toutes)
    --------------------------------------------------------------
    Select count(distinct E.id_trajet) from liste L,etape E
    Where  E.id = L.id_etape
    and    not exists (    
                       Select 'X' from etape E2
                       Where  E2.id_trajet = E.id_trajet
                       And    E2.id not in (Select L2.id_etape from liste L2)    
                      )

Discussions similaires

  1. SQL Oracle simple, mais pas pour moi
    Par Cyril75 dans le forum SQL
    Réponses: 2
    Dernier message: 24/02/2012, 16h19
  2. [MySQL] Requete basic mais compliqué pour moi
    Par omelhor dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 25/04/2011, 10h20
  3. Recherche d'une regex toute simple (mais pas pour moi)
    Par rambc dans le forum Général Python
    Réponses: 7
    Dernier message: 15/04/2009, 15h23
  4. Réponses: 6
    Dernier message: 27/04/2005, 15h46
  5. Requête un peu trop compliqué pour moi
    Par Kokito dans le forum Langage SQL
    Réponses: 5
    Dernier message: 18/04/2005, 15h17

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