Précédent   Forum des professionnels en informatique > Bases de données > MS SQL-Server
MS SQL-Server Forum Microsoft SQL-Server. Avant de poster -> FAQ SQL-Server, Tutoriels SQL-Server
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 20/09/2011, 18h28   #1
Invité de passage
 
Homme Amine Benchekroun
Inscription : septembre 2011
Messages : 5
Détails du profil
Informations personnelles :
Nom : Homme Amine Benchekroun
Localisation : France, Charente Maritime (Poitou Charente)

Informations forums :
Inscription : septembre 2011
Messages : 5
Points : 2
Points : 2
Par défaut supprimer les lignes en double d'une table qui comporte plusieurs colonnes

Bonjour,

J'ai une table qui comporte cinq champs, avec des enregistrements en double, je souhaiterai réaliser un select qui va extraire les données des cinq champs sans doublons.

Merci
bename00 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/09/2011, 18h49   #2
Expert Confirmé
 
Avatar de 7gyY9w1ZY6ySRgPeaefZ
 
Homme
dba
Inscription : juillet 2007
Messages : 2 521
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Canada

Informations professionnelles :
Activité : dba

Informations forums :
Inscription : juillet 2007
Messages : 2 521
Points : 3 969
Points : 3 969
Code :
1
2
3
SELECT champ1, champ2, champ3, champ4, champ5
FROM ma_table 
GROUP BY champ1, champ2, champ3, champ4, champ5
__________________
les règles du forum - mode d'emploi du forum
Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs.
(Rappel : "ça ne marche pas" n'est pas un message d'erreur)
JE NE RÉPONDS PAS aux questions techniques par message privé.
Écrire en français sur un forum est une marque minimale de respect.
7gyY9w1ZY6ySRgPeaefZ est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/09/2011, 19h13   #3
Invité de passage
 
Homme Amine Benchekroun
Inscription : septembre 2011
Messages : 5
Détails du profil
Informations personnelles :
Nom : Homme Amine Benchekroun
Localisation : France, Charente Maritime (Poitou Charente)

Informations forums :
Inscription : septembre 2011
Messages : 5
Points : 2
Points : 2
Négatif

SELECT Matricule, Prénom, Nom, Grade, Division, CIN
FROM Table_IVP
GROUP BY Matricule, Prénom, Nom, Grade, Division, CIN

Ca m'affiche toujours des doublons, au fait je souhaiterai avoir les champs nom et prénom en distinct
bename00 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/09/2011, 20h17   #4
Expert Confirmé
 
Avatar de 7gyY9w1ZY6ySRgPeaefZ
 
Homme
dba
Inscription : juillet 2007
Messages : 2 521
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Canada

Informations professionnelles :
Activité : dba

Informations forums :
Inscription : juillet 2007
Messages : 2 521
Points : 3 969
Points : 3 969
Citation:
Envoyé par bename00 Voir le message
SELECT Matricule, Prénom, Nom, Grade, Division, CIN
Désolé mais pour moi ça fait SIX champs et vu votre demande succinct, comment j'aurais pu deviné les noms de colonnes ???

Citation:
Envoyé par bename00 Voir le message
Ca m'affiche toujours des doublons, au fait je souhaiterai avoir les champs nom et prénom en distinct
Apprenez à exprimer votre besoin clairement.
En premier, c'était les lignes distincts sur tous les 5 champs et maintenant, c'est sur 2 champs des 6...
Jusqu'à présent la télépathie ne marche pas très bien.
D'ailleurs, si vous aviez observé les règles du foru ( http://club.developpez.com/regles/ )
vous auriez du nous fournir un jeu d'exemples et de résultat attendu ainsi que la structure de la table et ça éviterait ce jeu de ping pong / devinettes.

Essayez ceci mais je ne vous empêche pas d'essayer de comprendre un peu et d'adapter ou d'essayer des choses...

Code :
1
2
3
SELECT Prénom, Nom
FROM Table_IVP
GROUP BY Prénom, Nom
__________________
les règles du forum - mode d'emploi du forum
Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs.
(Rappel : "ça ne marche pas" n'est pas un message d'erreur)
JE NE RÉPONDS PAS aux questions techniques par message privé.
Écrire en français sur un forum est une marque minimale de respect.
7gyY9w1ZY6ySRgPeaefZ est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/09/2011, 20h53   #5
Invité de passage
 
Homme Amine Benchekroun
Inscription : septembre 2011
Messages : 5
Détails du profil
Informations personnelles :
Nom : Homme Amine Benchekroun
Localisation : France, Charente Maritime (Poitou Charente)

Informations forums :
Inscription : septembre 2011
Messages : 5
Points : 2
Points : 2
Négatif encore

Désolé, je reformule ma question :

J'ai une table qui comporte six champs :

Matricule Prénom Nom Grade Division CIN
1 Prénom1 Nom1 Grade1 Division1 CIN1
2 Prénom2 Nom2 Grade2 Division2 CIN2
3 Prénom3 Nom3 Grade3 Division3 CIN3
1 Prénom1 Nom1 Grade1 Division1 CIN1
1 Prénom1 Nom1 Grade1 Division1 CIN1
1 Prénom1 Nom1 Grade1 Division1 CIN1
2 Prénom2 Nom2 Grade2 Division2 CIN2

Je souhaiterai extraire les six champs avec des enregistrements non double de sorte à avoir le résultat ci-dessous :

Matricule Prénom Nom Grade Division CIN
1 Prénom1 Nom1 Grade1 Division1 CIN1
2 Prénom2 Nom2 Grade2 Division2 CIN2
3 Prénom3 Nom3 Grade3 Division3 CIN3

Votre première proposition du group by m'a donné un resultat avec doublons.
Votre deuxième proposition ne m'arrangera pas puisque j'ai besoin des six champs.

Vous dites : Essayez ceci mais je ne vous empêche pas d'essayer de comprendre un peu et d'adapter ou d'essayer des choses...

Belle expression
Ok, Merci
bename00 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/09/2011, 22h24   #6
Expert Confirmé
 
Avatar de 7gyY9w1ZY6ySRgPeaefZ
 
Homme
dba
Inscription : juillet 2007
Messages : 2 521
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Canada

Informations professionnelles :
Activité : dba

Informations forums :
Inscription : juillet 2007
Messages : 2 521
Points : 3 969
Points : 3 969
ça doit ça :
Code :
1
2
3
SELECT Matricule , Prénom , Nom , Grade , Division , CIN
FROM FROM Table_IVP
GROUP BY Matricule , Prénom , Nom , Grade , Division , CIN
Citation:
Envoyé par bename00 Voir le message
Vous dites : Essayez ceci mais je ne vous empêche pas d'essayer de comprendre un peu et d'adapter ou d'essayer des choses...
Belle expression
Ok, Merci
Effectivement, ce ne sont pas les tutoriels qui manquent concernant le SQL et les regroupements, rien que sur ce beau site...
Et c'est toujours bien de comprendre ce que l'on fait, non ?
__________________
les règles du forum - mode d'emploi du forum
Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs.
(Rappel : "ça ne marche pas" n'est pas un message d'erreur)
JE NE RÉPONDS PAS aux questions techniques par message privé.
Écrire en français sur un forum est une marque minimale de respect.
7gyY9w1ZY6ySRgPeaefZ est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/09/2011, 11h03   #7
Membre Expert
 
Homme Sylvain Devidal
Chef de projets Générix
Inscription : février 2010
Messages : 1 062
Détails du profil
Informations personnelles :
Nom : Homme Sylvain Devidal
Âge : 33
Localisation : France, Rhône (Rhône Alpes)

Informations professionnelles :
Activité : Chef de projets Générix
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : février 2010
Messages : 1 062
Points : 1 515
Points : 1 515
Citation:
Envoyé par 7gyY9w1ZY6ySRgPeaefZ Voir le message
Code :
1
2
3
SELECT champ1, champ2, champ3, champ4, champ5
FROM ma_table 
GROUP BY champ1, champ2, champ3, champ4, champ5
Outre la question mal posée, GROUP BY ne sert pas à filtrer les doublons, mais à retrouper les lignes.

Code :
1
2
SELECT DISTINCT champ1, champ2, champ3, champ4, champ5
FROM ma_table
Est donc plus appropriée comme réponse à la question initiale.

Donc au final :

Code :
1
2
SELECT DISTINCT Matricule , Prénom , Nom , Grade , Division , CIN
FROM FROM Table_IVP
Quite à utiliser GROUP BY pour n'importe quoi, pourquoi pas utiliser UNION aussi, qui fait un DISTINCT implicite...

Code :
1
2
3
4
5
SELECT Matricule , Prénom , Nom , Grade , Division , CIN
FROM FROM Table_IVP
union
SELECT Matricule , Prénom , Nom , Grade , Division , CIN
FROM FROM Table_IVP
StringBuilder est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/09/2011, 15h37   #8
Expert Confirmé
 
Avatar de 7gyY9w1ZY6ySRgPeaefZ
 
Homme
dba
Inscription : juillet 2007
Messages : 2 521
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Canada

Informations professionnelles :
Activité : dba

Informations forums :
Inscription : juillet 2007
Messages : 2 521
Points : 3 969
Points : 3 969
Excusez-moi, StringBuilder, je suis sûrement bien ignorant mais outre la différence de syntaxe entre
Code :
1
2
3
SELECT champ1, champ2, champ3, champ4, champ5
FROM ma_table 
GROUP BY champ1, champ2, champ3, champ4, champ5
et
Code :
1
2
SELECT DISTINCT champ1, champ2, champ3, champ4, champ5
FROM ma_table
C'est quoi la différence fondamentale ?
D'autant plus que les temps et les plans d’exécution sont identiques...
Pour moi, c'est une façon plus propre et plus explicite qu'un distinct.

En outre, je peux aussi fournir bien des exemples de SQL tarabiscotés mais il me semble que ma requête répond correctement à la demande, je ne comprends pas vraiment votre point.
__________________
les règles du forum - mode d'emploi du forum
Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs.
(Rappel : "ça ne marche pas" n'est pas un message d'erreur)
JE NE RÉPONDS PAS aux questions techniques par message privé.
Écrire en français sur un forum est une marque minimale de respect.
7gyY9w1ZY6ySRgPeaefZ est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/09/2011, 16h59   #9
Membre du Club
 
Inscription : décembre 2002
Messages : 82
Détails du profil
Informations forums :
Inscription : décembre 2002
Messages : 82
Points : 66
Points : 66
Bonjour,

Si c'est un problème de qualité de données non detecté/bloqué par des contraintes d'intégrités, vous pouvez nettoyer vos data simplement !

Code :
1
2
3
4
SELECT Ton_champs, COUNT(*)
FROM Ta_Table
GROUP BY Ton_champs
HAVING COUNT(*)>1
Vous avez alors toutes les lignes en doublons, vous pouvez les purger et réinsérer les bonnes données.


Maintenant, moi j'ai fais un truc tout con :

Code :
1
2
3
4
5
6
7
8
CREATE TABLE [dbo].[TABLE_TEST](
	[MATRICULE] [int] NULL,
	[PRENOM] [varchar](50) NULL,
	[NOM] [varchar](50) NULL,
	[GRADE] [varchar](50) NULL,
	[DIVISION] [varchar](50) NULL,
	[CIN] [varchar](50) NULL
) ON [PRIMARY]

Code :
1
2
3
4
5
6
7
INSERT INTO TABLE_TEST ([MATRICULE],[PRENOM], [NOM], [GRADE], [DIVISION], [CIN]) VALUES (1, 'Prénom1', 'Nom1', 'Grade1', 'Division1', 'CIN1');
INSERT INTO TABLE_TEST ([MATRICULE],[PRENOM], [NOM], [GRADE], [DIVISION], [CIN]) VALUES (2, 'Prénom2', 'Nom2', 'Grade2', 'Division2', 'CIN2');
INSERT INTO TABLE_TEST ([MATRICULE],[PRENOM], [NOM], [GRADE], [DIVISION], [CIN]) VALUES (3, 'Prénom3', 'Nom3', 'Grade3', 'Division3', 'CIN3');
INSERT INTO TABLE_TEST ([MATRICULE],[PRENOM], [NOM], [GRADE], [DIVISION], [CIN]) VALUES (1, 'Prénom1', 'Nom1', 'Grade1', 'Division1', 'CIN1');
INSERT INTO TABLE_TEST ([MATRICULE],[PRENOM], [NOM], [GRADE], [DIVISION], [CIN]) VALUES (1, 'Prénom1', 'Nom1', 'Grade1', 'Division1', 'CIN1');
INSERT INTO TABLE_TEST ([MATRICULE],[PRENOM], [NOM], [GRADE], [DIVISION], [CIN]) VALUES (1, 'Prénom1', 'Nom1', 'Grade1', 'Division1', 'CIN1');
INSERT INTO TABLE_TEST ([MATRICULE],[PRENOM], [NOM], [GRADE], [DIVISION], [CIN]) VALUES (2, 'Prénom2', 'Nom2', 'Grade2', 'Division2', 'CIN2');

Code :
1
2
3
4
SELECT *
FROM TABLE_TEST
WHERE MATRICULE IN (SELECT DISTINCT(MATRICULE) FROM TABLE_TEST)
GROUP BY [MATRICULE],[PRENOM], [NOM], [GRADE], [DIVISION], [CIN]

Voila
Glouferu est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 21/09/2011, 19h12   #10
Invité de passage
 
Homme Amine Benchekroun
Inscription : septembre 2011
Messages : 5
Détails du profil
Informations personnelles :
Nom : Homme Amine Benchekroun
Localisation : France, Charente Maritime (Poitou Charente)

Informations forums :
Inscription : septembre 2011
Messages : 5
Points : 2
Points : 2
Bonjour,

Problème toujours pas résolu

Les trois réponses affichent ceci :

7gyY9w1ZY6ySRgPeaefZ :
Code :
1
2
3
SELECT Matricule , Prénom , Nom , Grade , Division , CIN
FROM  Table_IVP
GROUP BY Matricule , Prénom , Nom , Grade , Division , CIN
StringBuilder :
Code :
1
2
SELECT DISTINCT Matricule , Prénom , Nom , Grade , Division , CIN
FROM Table_IVP
Glouferu :
Code :
1
2
3
4
SELECT *
FROM Table_IVP
WHERE MATRICULE IN (SELECT DISTINCT(MATRICULE) FROM Table_IVP)
GROUP BY [MATRICULE],[PRéNOM], [NOM], [GRADE], [DIVISION], [CIN]
Code :
Matricule , Prénom , Nom , Grade , Division , CIN
Code :
1
2
3
4
5
1111	Prénom1	Nom1	1	1	CIN1
1112	Prénom1	Nom1	1	1	CIN2
1113	Prénom3	Nom3	1	1	CIN3
1111	Prénom1	Nom1	2	1	CIN1
1111	Prénom1	Nom1	3	1	CIN1
Au fait, il manque un détail que je n'avais pas cité, et je m'en excuse profondément, c'est que les doublons d'enregistrements ne sont pas très identiques au niveau du champ grade.

Je souhaiterai avoir la liste des six champs avec un distinct sur les champs nom et le prénom seulement.
Si vous me dites, lequel des enregistrements en double je veux au final, je dirai ; n'importe lequel ...

Mes remerciements
bename00 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/09/2011, 19h26   #11
Expert Confirmé
 
Avatar de 7gyY9w1ZY6ySRgPeaefZ
 
Homme
dba
Inscription : juillet 2007
Messages : 2 521
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Canada

Informations professionnelles :
Activité : dba

Informations forums :
Inscription : juillet 2007
Messages : 2 521
Points : 3 969
Points : 3 969
Citation:
Envoyé par bename00 Voir le message
Au fait, il manque un détail que je n'avais pas cité, et je m'en excuse profondément, c'est que les doublons d'enregistrements ne sont pas très identiques au niveau du champ grade.
Il faudrait définir la notion "pas très identiques" car le SQL ne contient pas d'opérateur de comparaison "not quite the same"...
__________________
les règles du forum - mode d'emploi du forum
Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs.
(Rappel : "ça ne marche pas" n'est pas un message d'erreur)
JE NE RÉPONDS PAS aux questions techniques par message privé.
Écrire en français sur un forum est une marque minimale de respect.
7gyY9w1ZY6ySRgPeaefZ est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/09/2011, 21h25   #12
Membre du Club
 
Inscription : décembre 2002
Messages : 82
Détails du profil
Informations forums :
Inscription : décembre 2002
Messages : 82
Points : 66
Points : 66
Oui, si la valeur Grade est différente ... les lignes ne sont pas en doublons
Bon pour ma part, je pense que le grade le plus élevé est celui en rigueur faute de date !


Voici ce que ça donne :

Code :
1
2
3
4
5
6
SELECT * FROM TABLE_TEST AS T,
	(SELECT MATRICULE, max(GRADE) AS grade
	FROM TABLE_TEST
	GROUP BY MATRICULE) A
WHERE A.MATRICULE = T.MATRICULE
AND A.GRADE=T.GRADE

P.S.: Avec les 2 3 exemples de requêtes SQL que j'ai pu vous donner sur ce topic, vous allez pouvoir répondre a 90% des besoins en matières de sélection. Donc essayez de bien comprendre la logique et tout deviendra plus simple pour vous


Glouferu est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 22/09/2011, 13h53   #13
Invité de passage
 
Homme Amine Benchekroun
Inscription : septembre 2011
Messages : 5
Détails du profil
Informations personnelles :
Nom : Homme Amine Benchekroun
Localisation : France, Charente Maritime (Poitou Charente)

Informations forums :
Inscription : septembre 2011
Messages : 5
Points : 2
Points : 2
Problème résolu

Glouferu, votre solution est bien correct, juste un petit détail ; vu qu'un max grade d'une personne risque d'être en double aussi, le max ne fonctionnera pas, j'ai pensé alors a créer un id unique pour tout les enregistrement que j'ai, et je récupère le max ou le min id d'une personne puisque c'est un enregistrement au hasard qui m'intéresse.


Code :
1
2
3
4
5
6
SELECT  Mat , Prénom , Nom , Grade , Division , CIN
FROM IVP AS T ,
			(SELECT   MAX(id) AS id
			FROM IVP
			GROUP BY  Prénom, Nom ) A
WHERE   T.ID = A.ID
Je vous remercie énormément.

Salutations
bename00 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/09/2011, 14h55   #14
Membre Expert
 
Homme Sylvain Devidal
Chef de projets Générix
Inscription : février 2010
Messages : 1 062
Détails du profil
Informations personnelles :
Nom : Homme Sylvain Devidal
Âge : 33
Localisation : France, Rhône (Rhône Alpes)

Informations professionnelles :
Activité : Chef de projets Générix
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : février 2010
Messages : 1 062
Points : 1 515
Points : 1 515
Citation:
Envoyé par 7gyY9w1ZY6ySRgPeaefZ Voir le message
Excusez-moi, StringBuilder, je suis sûrement bien ignorant mais outre la différence de syntaxe entre
Code :
1
2
3
SELECT champ1, champ2, champ3, champ4, champ5
FROM ma_table 
GROUP BY champ1, champ2, champ3, champ4, champ5
et
Code :
1
2
SELECT DISTINCT champ1, champ2, champ3, champ4, champ5
FROM ma_table
C'est quoi la différence fondamentale ?
D'autant plus que les temps et les plans d’exécution sont identiques...
La différence fondamentale, c'est que "distinct" retourne toutes les valeurs distinctes des tuples retournés par le select.

Alors que group by effectue un regroupement des lignes en vue d'une utilisation conjointe avec une fonction de regroupement (min, max, etc.)
Le fait que GROUP BY faisse un distinct est un effet de bord uniquement, et il ne doit jamais être utilisé pour ça. C'est comme les gens qui croient que le GROUP BY et le ORDER BY sont synonymes : le ORDER BY est un effet de bord du GROUP BY et du DISTINCT. Cependant, ce n'est pas systématique (lors d'une jointure noramment, l'ordre n'est pas toujours assuré) !

Il s'agit donc d'une différence de sémantique.
Citation:
Envoyé par 7gyY9w1ZY6ySRgPeaefZ Voir le message
Pour moi, c'est une façon plus propre et plus explicite qu'un distinct.
Non, justement, puisque sémantiquement, il faut utiliser DISTINCT pour avoir des valeurs distinctes et GROUP BY pour avoir des valeurs groupées

Le fait que le plan d'exécution et le résultat soit identique n'est qu'un "coup de chance" parceque pour un SGBD donné, dans une situation donnée, il va faire la même chose. Cela n'est en rien assuré.
StringBuilder est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/09/2011, 16h11   #15
Membre du Club
 
Inscription : décembre 2002
Messages : 82
Détails du profil
Informations forums :
Inscription : décembre 2002
Messages : 82
Points : 66
Points : 66
Citation:
Envoyé par bename00 Voir le message
Problème résolu

Glouferu, votre solution est bien correct, juste un petit détail ; vu qu'un max grade d'une personne risque d'être en double aussi, le max ne fonctionnera pas, j'ai pensé alors a créer un id unique pour tout les enregistrement que j'ai, et je récupère le max ou le min id d'une personne puisque c'est un enregistrement au hasard qui m'intéresse.


Code :
1
2
3
4
5
6
SELECT  Mat , Prénom , Nom , Grade , Division , CIN
FROM IVP AS T ,
			(SELECT   MAX(id) AS id
			FROM IVP
			GROUP BY  Prénom, Nom ) A
WHERE   T.ID = A.ID
Je vous remercie énormément.

Salutations
A la place de rajouter une nouvelle colonne à ta table, tu peux la créer aussi en mémoire pour ton traitement. Je te laisse regarder la fonction :

Glouferu est déconnecté   Envoyer un message privé Réponse avec citation 10
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 18h49.


 
 
 
 
Partenaires

Hébergement Web