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

SQL Oracle Discussion :

Sélectionner une valeur en fonction de 2 autres valeurs.


Sujet :

SQL Oracle

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2020
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2020
    Messages : 17
    Points : 38
    Points
    38
    Par défaut Sélectionner une valeur en fonction de 2 autres valeurs.
    Bonjour,

    J'avance petit à petit à maitriser le langage SQL, mais je suis actuellement bloquer à quelque chose d'assez bête j'ai l'impression.
    Je souhaite vouloir sélectionner une valeur dans une colonne en fonction de 2 valeurs dans une autre colonne.
    De manière plus pratique, mon problème est le suivant :
    Je dispose des tables suivantes (que j'ai simplifié pour vous exposez mon problème en ne donnant que les attributs utiles ici):

    MATCH(Numero_match, Date_Match,#Score)
    SCORE(#Numero_Joueur,#Numero_Match)
    JOUEUR(Numero_Joueur,#Numero_Equipe)
    EQUIPE(Numero_Equipe, #Numero_Club,Categorie)
    Club(Numero_Club,Nom)

    Je souhaite donc déterminer un numéro de match en fonction du club de 2 équipes. Mais je n'arrive pas à faire en sorte de prendre e compte le nom des 2 équipes.
    En effet, ma requête étant la suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    select unique MATCH.NUMERO_MATCH 
    from ((((MATCH inner join SCORE on MATCH.NUMERO_MATCH = SCORE.NUMERO_MATCH)
                   inner join JOUEUR on SCORE.NUMERO_LICENCE_JOUEUR = JOUEUR.NUMERO_LICENCE_JOUEUR)
                   inner join EQUIPE on JOUEUR.NUMERO_EQUIPE = EQUIPE.NUMERO_EQUIPE)
                   inner join CLUB on EQUIPE.NUMERO_CLUB = CLUB.NUMERO_CLUB)
    where  MATCH.DATE_MATCH = '21-OCT-2019' and EQUIPE.NOM_CATEGORIE = 'U18' and NOM_CLUB = 'CLUB1' and NOM_CLUB = 'EQUIPE2;
    Au niveau de la jointure, oui j'aurai pu utiliser une vue pour plus de lisibilité, mais j'y vais pas à pas.
    Cette requête ne me retourne évidemment rien car le and entre le nom des 2 clubs ne représente pas ce que je veux.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    NOM_CLUB	     NUMERO_MATCH
    -------------------- ------------
    MONTPELLIER HANDBALL		1
    IVRY HANDBALL			1
    IVRY HANDBALL			2
    PARIS UC			3
    MONTPELLIER HANDBALL		3
    PARIS UC			2
    J'aimerai, si par exemple, le nom des 2 clubs est MONTPELLIER HANDBALL et IVRY HANDBALL obtenir le numéro 1 etc. Mais je n'arrive pas à voir comment je peux regrouper cela.
    Pourriez m'éclairer sur cela ?

    Je vous en remercie d'avance.

    Barad.

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 188
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 188
    Points : 12 744
    Points
    12 744
    Par défaut
    Bonjour,
    Vu le schéma, il faut partir de la table match, puis faire une jointure sur score, ensuite sur joueur.
    Pour finir il faut deux jointures sur la table équipe, avec un alias différent à chaque à chaque fois.
    Il faut aussi faire un "distinct", vu que tu passes par la table des joueurs, tu vas avoir une ligne par joueur/équipe.
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    select distinct e1.*,e2.*
    from match
    inner join score on (la jointure entre score et match)
    inner join joueur on (la jointure entre joueur et score)
    inner join equipe as e1 on (la jointure entre équipe e1 et joueur)
    inner join equipe as e2 on (la jointure entre équipe e2 et joueur)
    where (la condition de restriction)

    Tatayo.

    P.S. avant de me faire tirer dessus par les puristes , j'ai mis des * dans le select pour l'exemple. Il faut bien évidemment les remplacer par les colonnes nécessaires.

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2020
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2020
    Messages : 17
    Points : 38
    Points
    38
    Par défaut
    Bonjour tatayo.

    Merci de ta réponse. Elle m'aide un peu plus à comprendre, il me faut 2 colonnes équipes pour pouvoir faire le choix avec 2 nom de club différents, mais dans ta requête, tu ne mentionnes pas la jointure avec CLUB pour pouvoir obtenir le nom de club associer à l'équipe.
    De mon côté, j'ai donc écrit cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    select distinct MATCH.NUMERO_MATCH 
    from MATCH inner join SCORE  on MATCH.NUMERO_MATCH = SCORE.NUMERO_MATCH
                    inner join JOUEUR    on SCORE.NUMERO_LICENCE_JOUEUR = JOUEUR.NUMERO_LICENCE_JOUEUR
                    inner join EQUIPE E1 on JOUEUR.NUMERO_EQUIPE = E1.NUMERO_EQUIPE 
                    inner join EQUIPE E2 on JOUEUR.NUMERO_EQUIPE = E2.NUMERO_EQUIPE
                    inner join CLUB      on E1.NUMERO_CLUB = CLUB.NUMERO_CLUB
                    inner join CLUB      on E2.NUMERO_CLUB = CLUB.NUMERO_CLUB
    where  MATCH.DATE_MATCH = '21-OCT-2019' and E1.NOM_CATEGORIE = 'U18' and E2.NOM_CATEGORIE = 'U18'
           and E1.NOM_CLUB = "MONTPELLIER HANDBALL" and E2.NOM_CLUB = 'IVRY HANDBALL';
    Ma jointure avec CLUB ne semble pas être bonne. Et en testant, effectivement, j'obtiens une ambiguité de colonne.
    Comment puis-je récupérer le nom de club pour les 2 equipes sans faire la jointure avec club comme cela ?

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 188
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 188
    Points : 12 744
    Points
    12 744
    Par défaut
    Telle qu'est écrite ta requête, tu considères que les deux équipes sont dans le même club.
    Donc la table club, c'est "même faute, même punition" que pour la table équipe.
    Elle doit apparaître 2 fois dans la requête, avec deux alias, disons c1 et c2, une jointure entre c1 et e1 et une autre entre c2 et e2.

    Tatayo.

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2020
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2020
    Messages : 17
    Points : 38
    Points
    38
    Par défaut
    J'ai effectivement fait cela par la suite.
    Pour être sûr de ce que j'ai comme table, j'ai fais cette requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    select distinct C1.NOM_CLUB, C2.NOM_CLUB, E1.NUMERO_EQUIPE, E2.NUMERO_EQUIPE , MATCH.NUMERO_MATCH
    from MATCH     inner join SCORE     on MATCH.NUMERO_MATCH = SCORE.NUMERO_MATCH
                   inner join JOUEUR    on SCORE.NUMERO_LICENCE_JOUEUR = JOUEUR.NUMERO_LICENCE_JOUEUR
                   inner join EQUIPE E1 on JOUEUR.NUMERO_EQUIPE = E1.NUMERO_EQUIPE 
                   inner join EQUIPE E2 on JOUEUR.NUMERO_EQUIPE = E2.NUMERO_EQUIPE
                   inner join CLUB   C1 on E1.NUMERO_CLUB = C1.NUMERO_CLUB
                   inner join CLUB   C2 on E2.NUMERO_CLUB = C2.NUMERO_CLUB
    where  MATCH.DATE_MATCH = '21-OCT-2019' and E1.NOM_CATEGORIE = 'U18' and E2.NOM_CATEGORIE = 'U18'
    J'obtiens alors la table suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    NOM_CLUB	     NOM_CLUB		  NUMERO_EQUIPE NUMERO_EQUIPE NUMERO_MATCH
    -------------------- -------------------- ------------- ------------- ------------
    MONTPELLIER HANDBALL MONTPELLIER HANDBALL	      1 	    1		 1
    IVRY HANDBALL	     IVRY HANDBALL		      2 	    2		 2
    IVRY HANDBALL	     IVRY HANDBALL		      2 	    2		 1
    PARIS UC	     PARIS UC			      3 	    3		 2
    PARIS UC	     PARIS UC			      3 	    3		 3
    MONTPELLIER HANDBALL MONTPELLIER HANDBALL	      1 	    1		 3
    Mais j'ai l'impression de retomber dans mon problème de base, car quand je sélectionne avec 2 noms de clubs, je n'obtiens aucune colonne. Alors qu'en vérité, si j'ai C1.NOM_CLUB = 'MONTPELLIER HANDBALL' et C2.NOM_CLUB = 'IVRY HANDBALL', et que je sélectionne uniquement le numéro de match, obtenir 1.
    Quelque chose m'échappe mais je n'arrive pas bien à voir quoi...

  6. #6
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 188
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 188
    Points : 12 744
    Points
    12 744
    Par défaut
    Oups, autant pour moi.
    Il faut 2 fois la table joueur, sinon on considère qu'un même joueur est dans les deux équipes...
    Il faut aussi filtrer la requête sur le nom de l'équipe (ou du club), pour éviter d'avoi 2 lignes par match: C1.NOM_CLUB, C2.NOM_CLUB et C2.NOM_CLUB, C1.NOM_CLUB.
    Par exemple en ajoutant dans le where C1.NOM_CLUB < C2.NOM_CLUB, ou j1.numero_joueur < j2.numero_joueur.

    J'avais un doute dans ma première réponse, la prochaine fois j'écouterai mon petit doigt

    Tatayo.

  7. #7
    Nouveau membre du Club
    Homme Profil pro
    Consultant MOE-MOA Finance
    Inscrit en
    Novembre 2019
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Consultant MOE-MOA Finance
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2019
    Messages : 17
    Points : 36
    Points
    36
    Par défaut
    Bonjour,
    En suivant votre logique, même pour la table SCORE il en faut 2 Alias (puisque on a 2 joueurs différents)
    Mais j'aimerais comprendre comment sera matérialisé le score dans ton modèle. On a une nouvelle ligne dans la table Score à chaque fois qu'un joueur marque un but, c'est ça?

    Cette requête devrait répondre à ta demande:

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Select Distinct S1.Numero_match, C1.Nom, C2.Nom
    From   Score S1, Score S2, Equipe E1, Equipe E2, Club C1, Club C2, Joueur J1, Joueur J2
    WHERE  S1.Numero_match = S2.Numero_match
    AND    S1.Numero_Joueur = J1.Numero_Joueur
    AND    S2.Numero_Joueur = J2.Numero_Joueur
    AND    J1.Numero_Equipe = E1.Numero_Equipe
    AND    J2.Numero_Equipe = E2.Numero_Equipe
    AND    E1.Numero_Club = C1.Numero_Club
    AND    E2.Numero_Club = C2.Numero_Club
    AND    C1.Numero_Club < C2.Numero_Club
    Order by S1.Numero_Match;

  8. #8
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 188
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 188
    Points : 12 744
    Points
    12 744
    Par défaut
    De ce que j'ai compris, il y a une ligne de score par joueur/match.
    Mahdois, il faudrait utiliser JOIN pour les jointures, la requête serait bien plus lisible, puisque les jointures et les filtres seront séparés:
    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
    16
     
    Select Distinct match.Numero_match, C1.Nom, C2.Nom
    From match
    inner join Score S1 
        on s1.numero_match = match.numero_match
    inner join Score S2 
        on s2.numero_match = match.numero_match
    inner join joueur as j1 
        on j1.numero_joueur = s1.numero_joueur
    inner join joueur as j2 
        on j2.numero_joueur = s2.numero_joueur
    inner join equipe as e1 
        on E1.Numero_Club = C1.Numero_Club
    inner join equipe as e2 
        on E2.Numero_Club = C2.Numero_Club
    where C1.Numero_Club < C2.Numero_Club
    Tatayo.

  9. #9
    Nouveau membre du Club
    Homme Profil pro
    Consultant MOE-MOA Finance
    Inscrit en
    Novembre 2019
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Consultant MOE-MOA Finance
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2019
    Messages : 17
    Points : 36
    Points
    36
    Par défaut
    Bonjour Tatayo,
    Je ne vois pas l'utilité de la table Match dans votre requête (c'est pas faux mais inutile dans notre cas)
    En plus de ça il vous manque 2 petites jointures entres la table JOUEUR et EQUIPE (lignes 6 et 7 dans ma requête ci-dessus)

    Mahdois.

  10. #10
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 947
    Points : 5 846
    Points
    5 846
    Par défaut
    Je passerais plutôt par une division relationnelle.
    Si le numéro de match remonte 2 fois, c'est que le match a été joué par les 2 équipes sélectionnées dans le IN
    S'il ne remonte qu'une fois, c'est que le match a été joué par une des 2 équipes sélectionnées dans le IN avec une autre équipe non sélectionnée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    select MATCH.NUMERO_MATCH 
      from MATCH 
      join SCORE on MATCH.NUMERO_MATCH = SCORE.NUMERO_MATCH)
      join JOUEUR on SCORE.NUMERO_LICENCE_JOUEUR = JOUEUR.NUMERO_LICENCE_JOUEUR)
      join EQUIPE on JOUEUR.NUMERO_EQUIPE = EQUIPE.NUMERO_EQUIPE)
      join CLUB on EQUIPE.NUMERO_CLUB = CLUB.NUMERO_CLUB)
     where MATCH.DATE_MATCH = to_date('21/10/2019', 'dd/mm/yyyy')
       and EQUIPE.NOM_CATEGORIE = 'U18' 
       and NOM_CLUB in ('CLUB1', 'EQUIPE2')
     group by MATCH.NUMERO_MATCH 
    having count(*) = 2;
    PS : Il faut convertir la date passer en paramètre avec TO_DATE pour éviter les conversions implicites liées aux paramètres de session

  11. #11
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2020
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2020
    Messages : 17
    Points : 38
    Points
    38
    Par défaut
    Bonjour à tous,

    Merci de vos réponses et de votre aide.
    Le score représente les points marqués par un joueur dans un match. Donc si un joueur J1 marque 15 points dans le match, il y aura la valeur 15 dans le nombre de points marqué.
    Cela me permet de faire des statistiques pour savoir quelle joueur a marqué le + de points, le moins etc..

    En effet, si deux équipes (de 2 clubs différents évidemment) jouent le même match, ils ont évidemment le même numéro de match.
    Par exemple, MONTPELLIER HANDBALL a joué contre IVRY HANDBALL avec le numéro de match 1 (Ce numéro que je cherche à récupérer).

    Je vois en effet ce que fais ta requête skuatamad, et en effet une division semblerait une bonne idée.
    Mais en testant ta requête, je ne récupère malheureusement aucun numéro (en utilisant l'exemple des deux lignes plus haut) où je devrais récupérer 1.
    Je pense donc que cela vient du in. Mais je ne sais pas la raison. Je suppose que cela à revient à mon problème de départ encore une fois.

    La requête de tatayo fonctionne néanmoins (en ayant rajouté les jointures manquantes), mais je trouve qu'il y a peut-être beaucoup de jointure pour rien non ? Ou c'est peut-être une mauvaise compréhension.
    Je n'ai d'ailleurs pas compris cette ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    C1.NUMERO_CLUB < C2.NUMERO_CLUB
    Pourquoi doit-on la mettre ?

    Merci d'avance.

  12. #12
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 188
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 188
    Points : 12 744
    Points
    12 744
    Par défaut
    Je pars de la table match, pour pouvoir récupérer d'autres infos sur le match, pour la clarté de la requête, pour ajouter facilement d'autres critères (date du match, lieu...) sans avoir à "tout casser".
    Pour les jointures, c'est une erreur de ma part dans la réécriture de la requête, j'avais un peu de mal à "éclater" les conditions multiples du WHERE pour les normaliser en JOIN.
    Et je ne me suis pas relu

    Tatayo.

  13. #13
    Nouveau membre du Club
    Homme Profil pro
    Consultant MOE-MOA Finance
    Inscrit en
    Novembre 2019
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Consultant MOE-MOA Finance
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2019
    Messages : 17
    Points : 36
    Points
    36
    Par défaut
    Pour la condition: C1.NUMERO_CLUB < C2.NUMERO_CLUB
    C'est pou éviter d'avoir des doublons dans ton résultat (des doublons qui ne seront pas éliminés par le distinct)
    Par exemple pour le match que tu prends en exemple, sans cette condition t'auras ce résultat:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    NUMERO_MATCH   NOM_CLUB	                    NOM_CLUB		  
    ---------------------------------------------------------------------------------
    1              MONTPELLIER HANDBALL         IVRY HANDBALL		
    1              IVRY HANDBALL	            MONTPELLIER HANDBALL
    C'est bien le même match mais c'est pas un vrai doublon donc non éliminé par le DISTINCT (c'est dû aux 2 alias qu'on prend de la table)
    ça marche également pour les chaines de caractères, on aurait pu écrire C1.NIM_CLUB < C2.NOM_CLUB

  14. #14
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2020
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2020
    Messages : 17
    Points : 38
    Points
    38
    Par défaut
    Il y a quelque chose que je ne comprends pas néanmoins tatayo, car voilà le résultat de ta requête :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    NUMERO_MATCH NOM_CLUB		  NOM_CLUB
    ------------ -------------------- --------------------
    	   2 IVRY HANDBALL	  PARIS UC
    	   1 MONTPELLIER HANDBALL IVRY HANDBALL
    	   1 IVRY HANDBALL	  PARIS UC
    	   3 MONTPELLIER HANDBALL IVRY HANDBALL
    	   1 MONTPELLIER HANDBALL PARIS UC
    	   3 MONTPELLIER HANDBALL PARIS UC
    J'ai pour un même numéro de match, 3 équipes... Ce qui est assez bizarre. Car je devrais avoir PARIS contre IVRY 2 fois. MONTPELLIER IVRY 2 fois et PARIS contre MONTPELLIER 2 fois. Il semblerait que ça ait mélangé les rencontres.

  15. #15
    Nouveau membre du Club
    Homme Profil pro
    Consultant MOE-MOA Finance
    Inscrit en
    Novembre 2019
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Consultant MOE-MOA Finance
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2019
    Messages : 17
    Points : 36
    Points
    36
    Par défaut
    La requête où j'ai ajouté les condtions sur les noms des clubs et la date du match:

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    Select Distinct S1.Numero_match, MA.Date_Match, C1.Nom, C2.Nom
    From   Match MA, Score S1, Score S2, Equipe E1, Equipe E2, Club C1, Club C2, Joueur J1, Joueur J2
    WHERE  MA.Numero_Match = S1.Numero_Match
    AND    MA.Numero_match = S2.Numero_match
    AND    S1.Numero_Joueur = J1.Numero_Joueur
    AND    S2.Numero_Joueur = J2.Numero_Joueur
    AND    J1.Numero_Equipe = E1.Numero_Equipe
    AND    J2.Numero_Equipe = E2.Numero_Equipe
    AND    E1.Numero_Club = C1.Numero_Club
    AND    E2.Numero_Club = C2.Numero_Club
    -- Cette condition devient inutile puisqu'on a fixé les noms des clubs donc plus de risque de doublon
    -- AND    C1.Numero_Club < C2.Numero_Club
    AND    MA.Date_Match = to_date('21/10/2019', 'dd/mm/yyyy')
    AND    E1.NOM_CATEGORIE = 'U18' 
    AND    E2.NOM_CATEGORIE = 'U18' 
    AND    C1.NOM_CLUB = 'CLUB1'
    AND    C2.NOM_CLUB = 'EQUIPE2';

  16. #16
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 188
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 188
    Points : 12 744
    Points
    12 744
    Par défaut
    Tu peux nous montrer la requête exacte (donc avec les jointures que j'avais zappées), et le jeu de test utilisé ?
    Ma version corrigée (merci Mahdois) doit ressembler : ceci:
    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
    16
    17
    18
    19
    20
     
    Select Distinct match.Numero_match, C1.Nom, C2.Nom
    From match
    inner join Score S1 
        on s1.numero_match = match.numero_match
    inner join Score S2 
        on s2.numero_match = match.numero_match
    inner join joueur as j1 
        on j1.numero_joueur = s1.numero_joueur
    inner join joueur as j2 
        on j2.numero_joueur = s2.numero_joueur
    inner join equipe as e1 
        on E1.Numero_equipe = j1.Numero_equipe
    inner join equipe as e2 
        on E2.Numero_equipe = j2.Numero_equipe
    inner join club as c1
        on c1.numero_club = e1.numero_club
    inner join club as c2
        on c2.numero_club = e2.numero_club
    where C1.Numero_Club < C2.Numero_Club
    Tatayo.

  17. #17
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 947
    Points : 5 846
    Points
    5 846
    Par défaut
    Citation Envoyé par Barad Voir le message
    Je vois en effet ce que fais ta requête skuatamad, et en effet une division semblerait une bonne idée.
    Mais en testant ta requête, je ne récupère malheureusement aucun numéro (en utilisant l'exemple des deux lignes plus haut) où je devrais récupérer 1.
    Je pense donc que cela vient du in. Mais je ne sais pas la raison. Je suppose que cela à revient à mon problème de départ encore une fois.
    J'ai supposé que dans le 1er message les données présentées :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    NOM_CLUB	     NUMERO_MATCH
    -------------------- ------------
    MONTPELLIER HANDBALL		1
    IVRY HANDBALL			1
    IVRY HANDBALL			2
    PARIS UC			3
    MONTPELLIER HANDBALL		3
    PARIS UC			2
    était le résultat de la requête :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    select unique MATCH.NUMERO_MATCH 
    from ((((MATCH inner join SCORE on MATCH.NUMERO_MATCH = SCORE.NUMERO_MATCH)
                   inner join JOUEUR on SCORE.NUMERO_LICENCE_JOUEUR = JOUEUR.NUMERO_LICENCE_JOUEUR)
                   inner join EQUIPE on JOUEUR.NUMERO_EQUIPE = EQUIPE.NUMERO_EQUIPE)
                   inner join CLUB on EQUIPE.NUMERO_CLUB = CLUB.NUMERO_CLUB)
    where  MATCH.DATE_MATCH = '21-OCT-2019' and EQUIPE.NOM_CATEGORIE = 'U18'
    Le GROUP BY + HAVING fonctionne sur ces données :

    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
    16
    17
    18
    19
    SQL> with t as (
    select 'MONTPELLIER HANDBALL' as NOM_CLUB, 1 as NUMERO_MATCH from dual union all
    select 'IVRY HANDBALL' as NOM_CLUB, 1 as NUMERO_MATCH from dual union all
    select 'IVRY HANDBALL' as NOM_CLUB, 2 as NUMERO_MATCH from dual union all
    select 'PARIS UC' as NOM_CLUB, 3 as NUMERO_MATCH from dual union all
    select 'MONTPELLIER HANDBALL' as NOM_CLUB, 3 as NUMERO_MATCH from dual union all
    select 'PARIS UC' as NOM_CLUB, 2 as NUMERO_MATCH from dual
    )
    select NUMERO_MATCH
      from t
     where NOM_CLUB in ('MONTPELLIER HANDBALL', 'IVRY HANDBALL')
     group by NUMERO_MATCH
    having count(*) = 2;
     
    NUMERO_MATCH
    ------------
               1
     
    SQL>
    Pour déboguer il suffit de supprimer le HAVING et le GROUP BY pour analyser les données bruts des jointures.

  18. #18
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 814
    Points
    17 814
    Par défaut
    Je suis assez inquiet sur la modélisation globale - j'entends que vous êtes en train d'apprendre et je vous en félicite
    Mais un petit tour sur le forum Modélisation Merise vous serai tout autant profitable.

    En effet, je trouve assez étrange la représentation de ce championnat.
    Un match oppose deux équipes, en général une équipe qui reçoit et une équipe qui se déplace. Je ne vois pas pourquoi ces deux attributs ne sont pas dans la table match. A la rigueur pour une coupe on pourrait effectivement déporter les informations du match des équipes qui vont y participer, mais sur un championnat je pense que tout est connu dès le début de la saison (au dates qui peuvent être reportées près).

    Ensuite le score... pourquoi l'id joueur est ici ? C'est d'abord une équipe qui marque un but, et dans le détail vous pouvez rajouter les informations du joueur qui a marqué (et je ne connais pas suffisamment le handball pour savoir si la passe décisive, importante au foot l'est ici).
    Enfin il manque cruellement une table Composition, qui associe les joueurs à l'équipe pour le match. En effet un joueur même remplaçant figurant sur la feuille de match est considéré aussi comme étant victorieux si son équipe l'emporte.
    Et une table Effectif qui donne la profondeur de banc d'une équipe pour la saison (ou la mi-saison s'il y a des mercatos en cours d'année).

    Et surement d'autres choses auxquelles je n'ai pas pensé.

  19. #19
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2020
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2020
    Messages : 17
    Points : 38
    Points
    38
    Par défaut
    Bonjour à tous,

    Merci de vos réponses. J'ai finalement réussi à résoudre mon problème. Peut-être pas forcément de la meilleur des manières. Il y a peut-être plus "propre".

    J'ai d'abord réalisé une vue pour que ça soit plus claire qui regroupe l'ensemble des informations dont j'ai besoin
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    create or replace view VUE_MATCH
        as
        select CLUB.NOM_CLUB, MATCH.NUMERO_MATCH, MATCH.DATE_MATCH, EQUIPE.NOM_CATEGORIE
        from MATCH  inner join SCORE on MATCH.NUMERO_MATCH = SCORE.NUMERO_MATCH 
                    inner join JOUEUR on SCORE.NUMERO_LICENCE_JOUEUR = JOUEUR.NUMERO_LICENCE_JOUEUR
                    inner join PERSONNE on JOUEUR.NUMERO_PERSONNE = PERSONNE.NUMERO_PERSONNE
    	        inner join EQUIPE on EQUIPE.NUMERO_EQUIPE = JOUEUR.NUMERO_EQUIPE
                    inner join CLUB on EQUIPE.NUMERO_CLUB = CLUB.NUMERO_CLUB
        group by(CLUB.NOM_CLUB, MATCH.NUMERO_MATCH, MATCH.DATE_MATCH, EQUIPE.NOM_CATEGORIE);
    Par la suite, j'ai donc utilisé cette idée d'avoir "2 colonnes" pour pouvoir comparer les clubs.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    select distinct T1.NUMERO_MATCH
    from VUE_MATCH T1 --Tab 1
         left outer join
         VUE_MATCH  T2 -- Tab 2
    on T1.NUMERO_MATCH = T2.NUMERO_MATCH and T1.NOM_CLUB != T2.NOM_CLUB
    where T1.NOM_CATEGORIE = 'U18' and T1.DATE_MATCH = '21-OCT-2019'
    and T1.NOM_CLUB = 'IVRY HANDBALL' and T2.NOM_CLUB = 'MONTPELLIER HANDBALL';
    J'obtiens alors bien ce que je souhaite qu'importe les matchs. Je laisse vos yeux d'experts me donner des conseils pour avoir la chose la plus efficace possible.
    Pour te répondre Walder, merci tout d'abord de ces conseils. Mais je vais quand même t'expliquer pourquoi j'ai fais cela.
    Déjà je ne voulais pas forcément une modélisation la plus poussée. Je veux quelque chose de simple mais assez fonctionnelle.
    J'aurais pu en effet mettre directement mettre 2 équipes dans match pour que ça soit plus facile. Mais je me suis dis par la suite que comme c'est un élément que je peux retrouver par la suite.. Pourquoi le mettre. Après coup, je pense en effet que ça aurait été plus simple. Et comme je l'ai expliqué plus haut pour le score, j'ai fais cela pour pouvoir obtenir des statistiques. (Nombre de point marqué par un joueur, nombre de fautes etc).

    Merci en tout cas de votre aide ! J'ai appris pas mal de choses !

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 07/05/2020, 15h17
  2. [XL-2010] Valeur d'une cellule en fonction de trois autres
    Par chafoo dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 25/03/2015, 18h36
  3. Réponses: 2
    Dernier message: 28/05/2007, 10h28
  4. Sélectionner une valeur dans un RxDBLookupCombo
    Par Oluha dans le forum Bases de données
    Réponses: 2
    Dernier message: 22/09/2005, 10h10
  5. Est-il possible de sélectionner une valeur d'un menu déroula
    Par pontus21 dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 11/05/2005, 10h44

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