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

Développement SQL Server Discussion :

Question sur les INNER JOIN


Sujet :

Développement SQL Server

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Architecte technique
    Inscrit en
    Janvier 2012
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Janvier 2012
    Messages : 2
    Points : 1
    Points
    1
    Par défaut Question sur les INNER JOIN
    Bonjour

    voici mes tables et données d'exemple :
    Member : No_Membr, Nom
    10,Jack
    20,Jo
    30,Janna
    40,Black
    
    Game : No_Membr,No_Advers,PointageMembr,PointageAdvers
    10,20,6,5
    10,30,5,4
    30,10,2,3
    J'aimerais arriver a ce resultat avec une SELECT


    Nom1,Nom2,PointageMembr,PointageAdvers
    Jack,Jo,6,5
    Jack,Janne,5,4
    Janna,Jack,2,3

    voici la requete que j'ai tenter d'utiliser mais sans success j'obtiens des doublons Jack,Jo et Jo,Jack par exemple

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SELECT 
    	A.Prenom AS "Prenom1",
    	A.Nom AS "Nom1",
    	PS.PointageMembr,
    	PS.PointageAdvers,
    	B.Prenom AS "Prenom2",
    	B.Nom AS "Nom2"
    FROM Parties_Simple PS
    	INNER JOIN Membres A ON PS.No_Membr = A.No_Membr
    	INNER JOIN Membres B ON PS.No_Advers =  B.No_Membr
    WHERE PS.PointageMembr + PS.PointageAdvers >  0
    Merci !!

  2. #2
    Modérateur
    Avatar de sevyc64
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2007
    Messages
    10 192
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 192
    Points : 28 073
    Points
    28 073
    Par défaut
    Tu obtiens un doublon parce que tu l'as dans ta base, sinon la requete semble bonne :

    10,30,5,4
    30,10,2,3
    --- Sevyc64 ---

    Parce que le partage est notre force, la connaissance sera notre victoire

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    Architecte technique
    Inscrit en
    Janvier 2012
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Janvier 2012
    Messages : 2
    Points : 1
    Points
    1
    Par défaut Precision
    tu as raison j'avais des doublons dans la BD . Par contre j'aimerais obtenir une seule fois chaque partie . Donc j'aimerais que Dm_Partie soit unique dans le resultat de la requete . J'ai essayer de faire un GROUP BY Dm_Partie , mais j'obtiens toujours que des colonne ne font pas partis d'aggregate .
    Comment obtenir une partie unique...

    Merci

    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 
    	PS.Calibre AS "Calibre",
    	A.Prenom AS "Prenom1",
    	A.Nom AS "Nom1",
    	PS.PointageMembr,
    	PS.PointageAdvers,
    	B.Prenom AS "Prenom2",
    	B.Nom AS "Nom2",
    	PS.Dm_Partie
    FROM Parties_Simple PS
    	INNER JOIN Membres A ON PS.No_Membr = A.No_Membr
    	INNER JOIN Membres B ON PS.No_Advers =  B.No_Membr
    	WHERE PS.PointageMembr + PS.PointageAdvers >  0
    ORDER BY PS.Dm_Partie DESC
    Calibre	Prenom1	Nom1	PointageMembr	PointageAdvers	Prenom2	Nom2	Dm_Partie
    B+	Bernard	Frig	3	6	Stéphane	Turc	2011-08-25 21:32:54.000
    B+	Stéphane	Turc	6	3	Bernard	Frig	2011-08-25 21:32:54.000
    C	Stephane	Gon	9	5	Marielle	Ch	2011-08-25 20:08:53.000
    C	Stephane	Gon	9	5	Marielle	Ch	2011-08-25 20:08:53.000
    C	Marielle	Ch	5	9	Stephane	Gon	2011-08-25 20:08:53.000
    C	Marielle	Ch	5	9	Stephane	Gon	2011-08-25 20:08:53.000
    j'aimerais avoir ceci
    Calibre	Prenom1	Nom1	PointageMembr	PointageAdvers	Prenom2	Nom2	Dm_Partie
    B+	Bernard	Frig	3	6	Stéphane	Turc	2011-08-25 21:32:54.000
    C	Stephane	Gon	9	5	Marielle	Ch	2011-08-25 20:08:53.000

  4. #4
    Modérateur
    Avatar de sevyc64
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2007
    Messages
    10 192
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 192
    Points : 28 073
    Points
    28 073
    Par défaut
    Ben là, la question a se poser c'est pourquoi tu as des doublons dans ta base.

    Soit tu as un problème de conception, de ta base, du logiciel qui enregistre les données, des deux, etc, soit ce ne sont pas des doublons au sens des données elles-mêmes.

    Si il est légitime que tu es des doublons, il faut savoir ensuite quel élément du doublon tu vas utiliser et lequel tu vas ignorer, ou alors si tu veux les grouper quel information tu va agréger pour les regrouper. Tu cumule les scores ou tu en fait la moyenne? Tu prend le plus récent, le moins récent ? Etc...
    --- Sevyc64 ---

    Parce que le partage est notre force, la connaissance sera notre victoire

  5. #5
    Membre à l'essai
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2011
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Bâtiment

    Informations forums :
    Inscription : Décembre 2011
    Messages : 17
    Points : 22
    Points
    22
    Par défaut Bonjour à tous
    Je suis de l'avis de Sevyc64, il semble y avoir des questions à se poser sur la façon de renseigner la table des résultats.
    Cependant, dans l'hypothèse où Frank12 n'aurait pas la possibilité d'intervenir en amont, la seule solution semble de faire la distinction sur la date, c'est le seul champ qui semble être commun aux doublons. En revanche il faut être sûr qu'on n'ait pas plusieurs parties qui commencent en même temps.

    Personnellement, je modifierais le type du champ Dm_Partie pour avoir une précision à la milliseconde et j'utiliserais la requête suivante pour éliminer les doublons:



    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
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
     
     
    WITH RESULTAT_NUMEROTE AS
    (
    	SELECT
    		ROW_NUMBER() OVER (PARTITION BY PS.Dm_Partie ORDER BY A.Nom) AS Numero,
    		PS.Calibre AS "Calibre",
    		A.Prenom AS "Prenom1",
    		A.Nom AS "Nom1",
    		PS.PointageMembr,
    		PS.PointageAdvers,
    		B.Prenom AS "Prenom2",
    		B.Nom AS "Nom2",
    		PS.Dm_Partie
    	FROM
    		Parties_Simple PS
    		INNER JOIN Membres AS A ON PS.No_Membr=A.No_Membr
    		INNER JOIN Membres AS B ON PS.No_Advers=B.No_Membr
    	WHERE
    		PS.PointageMembr + PS.PointageAdvers>0
    )
     
    SELECT
    	Calibre, Prenom1, Nom1, PointageMembr, PointageAdvers, Prenom2, Nom2, Dm_Partie
    FROM
    	RESULTAT_NUMEROTE
    WHERE
    	Numero=1
    ORDER BY
    	Dm_Partie DESC
    Mais ce n'est pas très propre, il serait préférable d'éliminer les doublons à la source comme l'a expliqué Sevyc64

    Hope it will help

  6. #6
    Modérateur
    Avatar de sevyc64
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2007
    Messages
    10 192
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 192
    Points : 28 073
    Points
    28 073
    Par défaut
    Dans les exemples donnés, tout est identique, même la date.

    Soit toute la structure de la table n'est pas données et il y a réellement des champs qui permettent de faire la différence, et ce n'est pas des doublons dans la table,

    Soit c'est de vrai des doublons, cela signifie que la table en question n'a pas de clé primaire chose qui ne devrait jamais être fait en base relationnelle.

    Le problème qui se pose aussi, c'est, si ces données sont liées à d'autres données dans d'autres table. Dans le cas de doublon, quelle ligne retenir pour faire le lien ?
    --- Sevyc64 ---

    Parce que le partage est notre force, la connaissance sera notre victoire

  7. #7
    Membre à l'essai
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2011
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Bâtiment

    Informations forums :
    Inscription : Décembre 2011
    Messages : 17
    Points : 22
    Points
    22
    Par défaut
    Tout à fait d'accord, j'ai vraiment l'impression qu'il s'agit de vrais doublons et que les données sont insérées plusieurs fois.
    Je me suis en effet posé des questions sur la clé primaire de cette table.

    Frank12, 2 petites questions:
    1/ ta table des parties est-elle dotée d'une clé primaire ou d'une quelconque colonne unique pour chaque ligne?
    2/ Si la réponse est non, les parties sont-elles identifiées par un numéro ou une quelconque colonne unique pour chaque partie?

  8. #8
    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 820
    Points
    17 820
    Par défaut
    Plus simplement, il suffit de donner un ordre de priorité dans les numéros de membres.
    En repartant de la requête de Frank12 :
    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 PS.Calibre        AS "Calibre"
           , A.Prenom          AS "Prenom1"
           , A.Nom             AS "Nom1"
           , PS.PointageMembr
           , PS.PointageAdvers
           , B.Prenom          AS "Prenom2"
           , B.Nom             AS "Nom2"
           , PS.Dm_Partie
        FROM dbo.Parties_Simple AS PS
             INNER JOIN dbo.Membres AS A
               ON A.No_Membr = PS.No_Membr
             INNER JOIN dbo.Membres AS B
               ON B.No_Membr = PS.No_Advers
       WHERE PS.PointageMembr + PS.PointageAdvers > 0
         AND B.No_Membr < A.No_Membr
    ORDER BY PS.Dm_Partie DESC

  9. #9
    Membre à l'essai
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2011
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Bâtiment

    Informations forums :
    Inscription : Décembre 2011
    Messages : 17
    Points : 22
    Points
    22
    Par défaut
    Oui mais encore faut-il que No_Membr existe!! car je ne suis pas sur que le premier exemple de Frank12 soit en rapport avec le second.
    De plus je crois qu'il faudrait ajouter un distinct dans ta requête pour éliminer les vrais doublons.

    Frank12 ce serait bien si tu avais la liste complète de tes colonnes ou un schéma du modèle

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2012
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2012
    Messages : 7
    Points : 10
    Points
    10
    Par défaut
    Je pense que la solution de Waldar est la bonne si on veut garder la base avec des doublons. Mais attention si pour une partie il n'y a pas de doublon, et que le joueur B est supérieur à A alors ça le supprime, je corrigerai ainsi en rajoutant des doublons (A tester, je ne suis pas sure de mon coup, ni que le Distinct soit utile)

    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 PS.Calibre        AS "Calibre"
           , A.Prenom          AS "Prenom1"
           , A.Nom             AS "Nom1"
           , PS.PointageMembr
           , PS.PointageAdvers
           , B.Prenom          AS "Prenom2"
           , B.Nom             AS "Nom2"
           , PS.Dm_Partie
        FROM dbo.Parties_Simple AS PS
             INNER JOIN dbo.Membres AS A
               ON A.No_Membr = PS.No_Membr or A.No_Membr = PS.No_Advers  
             INNER JOIN dbo.Membres AS B
               ON B.No_Membr = PS.No_Advers  or B.No_Membr = PS.No_Membr
       WHERE PS.PointageMembr + PS.PointageAdvers > 0
         AND B.No_Membr < A.No_Membr
    ORDER BY PS.Dm_Partie DESC

Discussions similaires

  1. [2.3] Question sur les Join Data Set
    Par scariou29 dans le forum BIRT
    Réponses: 2
    Dernier message: 06/10/2008, 12h34
  2. question sur les vertex buffer et index buffer
    Par airseb dans le forum DirectX
    Réponses: 9
    Dernier message: 25/08/2003, 02h38
  3. question sur les variables globales et les thread posix
    Par souris_sonic dans le forum POSIX
    Réponses: 5
    Dernier message: 13/06/2003, 13h59
  4. Question sur les handles et les couleurs...
    Par MrDuChnok dans le forum C++Builder
    Réponses: 7
    Dernier message: 29/10/2002, 08h45
  5. question sur les message box !
    Par krown dans le forum Langage
    Réponses: 7
    Dernier message: 02/08/2002, 16h11

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