Précédent   Forum des professionnels en informatique > Bases de données > MS SQL-Server > Développement
Développement Forum d'entraide sur le Transact-SQL, le CLR, les procédures stockées, les triggers, les requêtes SQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 07/01/2012, 18h05   #1
Invité de passage
 
Homme
Architecte technique
Inscription : janvier 2012
Messages : 2
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Canada

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

Informations forums :
Inscription : janvier 2012
Messages : 2
Points : 0
Points : 0
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 :
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 !!
Frank12 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/01/2012, 19h35   #2
Modérateur
 
Avatar de sevyc64
 
Homme Yves
Développeur informatique
Inscription : janvier 2007
Messages : 3 883
Détails du profil
Informations personnelles :
Nom : Homme Yves
Âge : 39
Localisation : France, Pyrénées Atlantiques (Aquitaine)

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : janvier 2007
Messages : 3 883
Points : 7 670
Points : 7 670
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 --- Le partage est notre force

NON AU LANGAGE SMS & FAUTES VOLONTAIRES SUR LES FORUMS
sevyc64 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/01/2012, 21h01   #3
Invité de passage
 
Homme
Architecte technique
Inscription : janvier 2012
Messages : 2
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Canada

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

Informations forums :
Inscription : janvier 2012
Messages : 2
Points : 0
Points : 0
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 :
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
Frank12 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/01/2012, 21h10   #4
Modérateur
 
Avatar de sevyc64
 
Homme Yves
Développeur informatique
Inscription : janvier 2007
Messages : 3 883
Détails du profil
Informations personnelles :
Nom : Homme Yves
Âge : 39
Localisation : France, Pyrénées Atlantiques (Aquitaine)

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : janvier 2007
Messages : 3 883
Points : 7 670
Points : 7 670
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 --- Le partage est notre force

NON AU LANGAGE SMS & FAUTES VOLONTAIRES SUR LES FORUMS
sevyc64 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/01/2012, 12h50   #5
Membre à l'essai
 
Homme Fabrice Flores
Administrateur de base de données
Inscription : décembre 2011
Messages : 17
Détails du profil
Informations personnelles :
Nom : Homme Fabrice Flores
Âge : 46
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 : 20
Points : 20
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 :
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
fflores est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/01/2012, 15h38   #6
Modérateur
 
Avatar de sevyc64
 
Homme Yves
Développeur informatique
Inscription : janvier 2007
Messages : 3 883
Détails du profil
Informations personnelles :
Nom : Homme Yves
Âge : 39
Localisation : France, Pyrénées Atlantiques (Aquitaine)

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : janvier 2007
Messages : 3 883
Points : 7 670
Points : 7 670
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 --- Le partage est notre force

NON AU LANGAGE SMS & FAUTES VOLONTAIRES SUR LES FORUMS
sevyc64 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/01/2012, 16h52   #7
Membre à l'essai
 
Homme Fabrice Flores
Administrateur de base de données
Inscription : décembre 2011
Messages : 17
Détails du profil
Informations personnelles :
Nom : Homme Fabrice Flores
Âge : 46
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 : 20
Points : 20
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?
fflores est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/01/2012, 15h27   #8
Modérateur
 
Homme Fabien
Ingénieur d'études en décisionnel
Inscription : septembre 2008
Messages : 5 686
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Âge : 34
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études en décisionnel
Secteur : Arts - Culture

Informations forums :
Inscription : septembre 2008
Messages : 5 686
Points : 10 435
Points : 10 435
Envoyer un message via ICQ à Waldar Envoyer un message via Skype™ à Waldar
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 :
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
__________________
Email : http://scr.im/waldar
Waldar est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/01/2012, 18h32   #9
Membre à l'essai
 
Homme Fabrice Flores
Administrateur de base de données
Inscription : décembre 2011
Messages : 17
Détails du profil
Informations personnelles :
Nom : Homme Fabrice Flores
Âge : 46
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 : 20
Points : 20
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
fflores est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/01/2012, 16h24   #10
Candidat au titre de Membre du Club
 
Inscription : janvier 2012
Messages : 7
Détails du profil
Informations forums :
Inscription : janvier 2012
Messages : 7
Points : 10
Points : 10
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 :
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
Renaud58 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 08h50.


 
 
 
 
Partenaires

Hébergement Web