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 sur plusieurs tables


Sujet :

Langage SQL

  1. #1
    Membre à l'essai
    Homme Profil pro
    Occupé
    Inscrit en
    Décembre 2021
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Occupé

    Informations forums :
    Inscription : Décembre 2021
    Messages : 28
    Points : 14
    Points
    14
    Par défaut Problème requête sur plusieurs tables
    Bonsoir.
    J'éprouve beaucoup de difficultés à rédiger une requête qui fonctionne. Je parviens à le faire en multipliant les requêtes pour parvenir au résultat mais je souhaiterais avoir le même résultat au moyen d'une requête unique.

    Voici la structure de ma base de données:

    Nom : Capture d’écran 2021-12-06 à 19.21.29.png
Affichages : 128
Taille : 439,3 Ko


    Ce que je tente d'obtenir, c'est la liste des idpropriétaires des chevaux partants pour une course donnée qui a eu lieu à une date donnée.
    Ma difficulté vient aussi du fait que la date de la course doit être récupérée à l'aide de courseId et qu'elle doit être ensuite comprise entre début et fin pour le propriétaire pour qu'il soit celui au moment de la course.

    J'ai tenté une requête de ce type mais j'obtiens une liste vide ou des erreurs.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    SELECT ProprietaireId FROM PROPRIETAIRE_HISTO JOIN PARTANT USING (ChevalId) WHERE CourseId ={0} AND  \
                    CourseId >=ProprietaireDebut AND CourseId <=ProprietaireFin \
    CourseId étant renouvelé à chaque recherche sur une course.
    Vous auriez une idée ? Merci pour votre aide

  2. #2
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 133
    Points : 38 556
    Points
    38 556
    Billets dans le blog
    9
    Par défaut
    Bonjour,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    select PA.courseid
         , PA.coursedate
         , PA.chevalid
         , PR.proprid
    from  PARTANT PA
    left join PROPRIETAIRE_HISTO PR
      on PR.chevalid = PA.chevalid
     and PA.coursedate between PR.dtdeb and PR.dtfin
    WHERE PA.courseid in(...)
    ;

  3. #3
    Membre à l'essai
    Homme Profil pro
    Occupé
    Inscrit en
    Décembre 2021
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Occupé

    Informations forums :
    Inscription : Décembre 2021
    Messages : 28
    Points : 14
    Points
    14
    Par défaut
    Merci Escartefigue.

    J'ai tenté bien tenté le code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT PA.CourseId , PA.CourseDate , PA.ChevalId, PR.ProprietaireId from PARTANT PA left join PROPRIETAIRE_HISTO PR on PR.ChevalId = PA.ChevalId and PA.CourseDate between PR.ProprietaireDebut and PR.ProprietaireFin WHERE PA.CourseId in(258)
    mais j'obtiens l'erreur

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    sqlite3.OperationalError: no such column: PA.CourseDate
    car CourseDate n'existe pas dans la table PARTANT.
    Ma requête met en jeu 3 tables.

  4. #4
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 133
    Points : 38 556
    Points
    38 556
    Billets dans le blog
    9
    Par défaut
    Autant pour moi, CourseDate est une colonne de la table COURSE

    Ajoutez simplement une jointure sur la table COURSE.

    Note : attention, CourseDate est de type integer, inadapté pour une date ! Les dates doivent impérativement êtres stockées dans une colonne de type date, sans quoi c'est la source de tous les maux (intégrité non garantie, tris sur date hasardeux, fonctions date non applicable sans transtypage couteux, prédicats non sargables etc.)

  5. #5
    Membre à l'essai
    Homme Profil pro
    Occupé
    Inscrit en
    Décembre 2021
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Occupé

    Informations forums :
    Inscription : Décembre 2021
    Messages : 28
    Points : 14
    Points
    14
    Par défaut
    Ok. Même si mes dates sont de type 20211207
    comme pour ce jour ?


    J'ai tenté ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     SELECT PA.CourseId , CO.CourseDate , PA.ChevalId, PR.ProprietaireId from PARTANT PA left join COURSE CO on CO.CourseId =258 left join PROPRIETAIRE_HISTO PR on PR.ChevalId = PA.ChevalId and CO.CourseDate between PR.ProprietaireDebut and PR.ProprietaireFin WHERE PA.CourseId =258
    Ça fonctionne mais j'obtiens un ensemble de tuples qui sont constitués de (CourseId, CourseDate, ChevalId, ProprietaireId) alors que je souhaiterais avoir des tuples ne comprenant que les ProprietaireId.
    En revanche, en vérifiant les résultats, les idsPropriétaires sont bien ceux affectés au ChevalId de la Course à la bonne date. Il n'y a pas d'erreurs dans les résultats retournés.
    Je crois qu'il y a uniquement un ajustement qui m'échappe pour n'obtenir que les ProprietaireId. Mais je ne peux pas supprimer PA.CourseId , CO.CourseDate , PA.ChevalId, devant le SELECT ?!

  6. #6
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 133
    Points : 38 556
    Points
    38 556
    Billets dans le blog
    9
    Par défaut
    Bonjour
    Citation Envoyé par MagicJohnson Voir le message
    Ok. Même si mes dates sont de type 20211207 comme pour ce jour ?
    Il ne faut pas confondre le type qui est une propriété de la colonne et donc de la base de données et le format d'affichage qui est une mise en forme par le traitement. Dans une colonne de type date, on ne peut stocker qu'une date valide. C'est le SGBD qui contrôle cette validité et toute valeur erronée provoque une erreur. Lors de l'insertion ou de la mise à jour dans la BDD, il faut fournir la date selon un format compatible (le plus souvent 'CCAA-MM-JJ' format ISO 8601)


    Citation Envoyé par MagicJohnson Voir le message
    Ça fonctionne mais j'obtiens un ensemble de tuples qui sont constitués de (CourseId, CourseDate, ChevalId, ProprietaireId) alors que je souhaiterais avoir des tuples ne comprenant que les ProprietaireId.
    Je ne sais pas s'il est intéressant d'obtenir une liste des propriétaires sans savoir quels sont les chevaux, mais pour ce besoin, il suffit de ne mettre que la colonne souhaitée dans la clause SELECT en ajoutant DISTINCT.

    Exemple :
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    select distinct PR.ProprietaireId
    from  PARTANT PA
    inner join COURSE CO
       on CO.CourseId=PA.CourseId
    inner join PROPRIETAIRE_HISTO PR
      on PR.ChevalId = PA.ChevalId
     and CO.CourseDate between PR.Dtdeb and PR.Dtfin
    where CO.CourseId=4 
    ;

    Note : une requête mise en forme est bien plus facile à lire et à maintenir que si tout est mis sur une seule ligne

  7. #7
    Membre à l'essai
    Homme Profil pro
    Occupé
    Inscrit en
    Décembre 2021
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Occupé

    Informations forums :
    Inscription : Décembre 2021
    Messages : 28
    Points : 14
    Points
    14
    Par défaut
    Merci Escartefigue.

    J'avais trouvé que cela fonctionnait car j'ai vérifié les résultats fournis en soumettant plusieurs ids de courses différentes:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    SELECT PR.ProprietaireId    from PARTANT PA \
                                                left join COURSE CO \
                                                on CO.CourseId =894 \
                                                left join PROPRIETAIRE_HISTO PR \
                                                on PR.ChevalId = PA.ChevalId \
                                                and CO.CourseDate \
                                                between PR.ProprietaireDebut \
                                                and PR.ProprietaireFin \
                                                WHERE PA.CourseId =894
    Tu pourrais si ça ne t'ennuie pas me dire ce qui aurait fini par clocher ?
    Merci.

  8. #8
    Inactif  

    Homme Profil pro
    Freelance EURL / Business Intelligence ETL
    Inscrit en
    Avril 2005
    Messages
    5 879
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance EURL / Business Intelligence ETL
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2005
    Messages : 5 879
    Points : 26 147
    Points
    26 147
    Billets dans le blog
    3
    Par défaut
    Hello,

    Tu as "cassé" la jointure de ta table Course (CO) produit cartésien !
    - So.... what exactly is preventing us from doing this?
    - Geometry.
    - Just ignore it !!
    ****
    "The longer he lived, the more he realized that nothing was simple and little was true" A clash of Kings, George R. R. Martin.
    ***
    Quand arrivera l'apocalypse, il restera deux types d'entreprise : les pompes funèbres et les cabinets d'audit. - zecreator, 21/05/2019

  9. #9
    Membre à l'essai
    Homme Profil pro
    Occupé
    Inscrit en
    Décembre 2021
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Occupé

    Informations forums :
    Inscription : Décembre 2021
    Messages : 28
    Points : 14
    Points
    14
    Par défaut
    C'est bizarre, j'ai essayé d'appliquer le même principe pour récupérer les Ids des Propriétaires des 5 premiers chevaux des courses et j'ai des incohérences:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    SELECT DISTINCT PR.ProprietaireId FROM PARTANT PA \
                INNER JOIN COURSE CO \
                ON CO.CourseId=PA.CourseId\
                INNER JOIN PROPRIETAIRE_HISTO PR \
                ON PR.ChevalId = PA.ChevalId  \
                AND CO.CourseDate between PR.ProprietaireDebut and PR.ProprietaireFin \
                WHERE CO.CourseId={0}  \
                AND PA.RangId BETWEEN 1 AND 5

  10. #10
    Inactif  

    Homme Profil pro
    Freelance EURL / Business Intelligence ETL
    Inscrit en
    Avril 2005
    Messages
    5 879
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance EURL / Business Intelligence ETL
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2005
    Messages : 5 879
    Points : 26 147
    Points
    26 147
    Billets dans le blog
    3
    Par défaut
    On a ta requête mais on n'a pas tes résultats ! Qu'est-ce que tu cherches ? ça devrait te ramener effectivement les 5 propriétaires des chevaux gagnants de la course #0, et possiblement un propriétaire peut avoir plusieurs chevaux.

    Ce serait plus facile de débugger si tu multiplies au contraire le nombre de colonnes pour vérifier l'intégrité de tes jointures.
    - So.... what exactly is preventing us from doing this?
    - Geometry.
    - Just ignore it !!
    ****
    "The longer he lived, the more he realized that nothing was simple and little was true" A clash of Kings, George R. R. Martin.
    ***
    Quand arrivera l'apocalypse, il restera deux types d'entreprise : les pompes funèbres et les cabinets d'audit. - zecreator, 21/05/2019

  11. #11
    Membre à l'essai
    Homme Profil pro
    Occupé
    Inscrit en
    Décembre 2021
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Occupé

    Informations forums :
    Inscription : Décembre 2021
    Messages : 28
    Points : 14
    Points
    14
    Par défaut
    Bonjour,

    Autant pour moi, c'était moi qui me suis trompé dans l'ordre de récupération des résultats.
    Le code pour l'arrivée était le bon.

    Glutinus, Escartefigue, merci pour le coup de main. Sympa.

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 16/03/2016, 21h16
  2. Réponses: 4
    Dernier message: 07/07/2011, 08h51
  3. Réponses: 2
    Dernier message: 12/01/2008, 14h57
  4. suite au problème de requête sur plusieur table
    Par michelGProuq dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 07/07/2006, 16h19
  5. Requête sur plusieurs tables
    Par drinkmilk dans le forum Langage SQL
    Réponses: 8
    Dernier message: 11/07/2005, 12h25

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