Précédent   Forum des professionnels en informatique > Bases de données > Langage SQL
Langage SQL Forum d'entraide sur le langage SQL et sur les questions liées à la conception de schéma (DDL). Cours 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 03/06/2011, 14h39   #1
Candidat au titre de Membre du Club
 
Homme Allouchi
Développeur informatique
Inscription : janvier 2007
Messages : 40
Détails du profil
Informations personnelles :
Nom : Homme Allouchi
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Développeur informatique
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : janvier 2007
Messages : 40
Points : 14
Points : 14
Envoyer un message via MSN à allouchi
Par défaut Afficher les doublons d'une table

Bonjour,
Je souhaite afficher les doublons d'une table :
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
31
32
33
34
35
36
37
38
39
40
idpersonne      | idspecialite    | idtype
----------------+-------------------+-------
   290000001 |              11 |     7
     290000002 |                10 |     7
   290000003 |              11 |     7
     290000004 |                  8 |     7
   290000005 |              11 |     7
     290000006 |                10 |     7
     290000007 |                  8 |     7
   290000008 |              11 |     7
   290000009 |              11 |     7
     290000010 |                10 |     7
     290000011 |                10 |     7
 290000012 |                11 |     7
     290000013 |                11 |     7
     290000014 |                10 |     7
     290000015 |                11 |     7
     290000016 |                10 |     7
     290000017 |                11 |     7
     290000018 |                11 |     7
     290000019 |                11 |     7
     290000020 |                11 |     7
     290000021 |                11 |     7
     290000022 |                11 |     7
     290000023 |                11 |     7
     290000024 |                11 |     7
     290000025 |                 8 |     7
     290000026 |                11 |     7
     290000027 |                11 |     7
     290000028 |                11 |     7
     290000029 |                11 |     7
     290000030 |                11 |     7
     290000031 |                11 |     7
     290000032 |                11 |     7
     290000033 |                11 |     7
     290000034 |                11 |     7
     290000035 |                11 |     7
     290000036 |                 8 |     7
     290000037 |                11 |     7
Je voudrais afficher par exemple toutes les lignes qui sont gras.
J'ai fait une requête comme ceci (mysql):
Code :
1
2
3
4
5
6
7
8
 
SELECT *
FROM personne T1
WHERE  EXISTS (SELECT *
               FROM    personne T2
               WHERE  T1.idpersonne <> T2.idpersonne
                 AND  T1.idspecialite = T2.idspecialite
                 AND  T1.idtype = T2.idtype);
ça ne marche pas.
Merci pour votre aide.
allouchi est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/06/2011, 14h49   #2
Membre éclairé
 
Inscription : mars 2009
Messages : 228
Détails du profil
Informations forums :
Inscription : mars 2009
Messages : 228
Points : 318
Points : 318
Bonjour,

Peut-être quelques choses du style :

Code :
1
2
 
SELECT idspecialiste, idtype, count(idpersonne) AS num_occurence, array_accum(idpersonne) FROM personne GROUP BY idspecialiste, idtype HAVING count(idpersonne) > 1;
(non testée, j'ai un doute sur l'ordre group by, having)
bretus est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/06/2011, 15h05   #3
Membre habitué
 
Avatar de tfc3146
 
Homme Robert Labrousse
Développeur décisionnel
Inscription : février 2009
Messages : 79
Détails du profil
Informations personnelles :
Nom : Homme Robert Labrousse
Localisation : France

Informations professionnelles :
Activité : Développeur décisionnel
Secteur : Boutique - Magasin

Informations forums :
Inscription : février 2009
Messages : 79
Points : 134
Points : 134
Bizarre la même requete passe pour moi sous SQL Server

Code :
1
2
3
4
5
SELECT * FROM dbo.TOTO T1
WHERE EXISTS (SELECT * FROM dbo.TOTO T2
			  WHERE T1.id<>T2.id
			AND T1.nom1=T2.nom1
			AND T1.nom2=T2.nom2)
tfc3146 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/06/2011, 15h07   #4
Candidat au titre de Membre du Club
 
Homme Allouchi
Développeur informatique
Inscription : janvier 2007
Messages : 40
Détails du profil
Informations personnelles :
Nom : Homme Allouchi
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Développeur informatique
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : janvier 2007
Messages : 40
Points : 14
Points : 14
Envoyer un message via MSN à allouchi
Citation:
Envoyé par bretus Voir le message
Bonjour,

Peut-être quelques choses du style :

Code :
1
2
 
SELECT idspecialiste, idtype, count(idpersonne) AS num_occurence, array_accum(idpersonne) FROM personne GROUP BY idspecialiste, idtype HAVING count(idpersonne) > 1;
(non testée, j'ai un doute sur l'ordre group by, having)
Merci pour votre réponse, ça a l'air de marcher, je testerai sur ma vraie base lundi.
Encore merci.
allouchi est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/06/2011, 15h09   #5
Candidat au titre de Membre du Club
 
Homme Allouchi
Développeur informatique
Inscription : janvier 2007
Messages : 40
Détails du profil
Informations personnelles :
Nom : Homme Allouchi
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Développeur informatique
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : janvier 2007
Messages : 40
Points : 14
Points : 14
Envoyer un message via MSN à allouchi
Citation:
Envoyé par tfc3146 Voir le message
Bizarre la même requete passe pour moi sous SQL Server

SELECT * FROM dwh_anael.dbo.TOTO T1
WHERE EXISTS (SELECT * FROM dbo.TOTO T2
WHERE T1.id<>T2.id
AND T1.nom1=T2.nom1
AND T1.nom2=T2.nom2)
Oui, c'est bizarre ça passe pas sur mysql.
Merci pour la réponse.
allouchi est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/06/2011, 15h12   #6
Candidat au titre de Membre du Club
 
Homme Allouchi
Développeur informatique
Inscription : janvier 2007
Messages : 40
Détails du profil
Informations personnelles :
Nom : Homme Allouchi
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Développeur informatique
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : janvier 2007
Messages : 40
Points : 14
Points : 14
Envoyer un message via MSN à allouchi
Citation:
Envoyé par allouchi Voir le message
Merci pour votre réponse, ça a l'air de marcher, je testerai sur ma vraie base lundi.
Encore merci.
Par contre, je ne connais pas cette fonction : array_accum()?
allouchi est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/06/2011, 17h51   #7
Membre éclairé
 
Inscription : mars 2009
Messages : 228
Détails du profil
Informations forums :
Inscription : mars 2009
Messages : 228
Points : 318
Points : 318
Citation:
Envoyé par allouchi Voir le message
Par contre, je ne connais pas cette fonction : array_accum()?
Spécifique à MySQL, elle agrège les résultats.

Si vous avez besoin des résultats sur plusieurs lignes, ça ressemblerait plutôt à cela avec un sub-select :

Code :
1
2
3
4
 
SELECT p.idpersonne,p.idspecialiste,p.idtype 
	FROM ( SELECT idspecialiste,idtype,count(idpersonne) AS num_occurence FROM personne p1 GROUP BY idspecialiste,idtype HAVING count(idpersonne) > 1 ) AS doublon
		LEFT JOIN personne p ON doublon.idspecialiste = p.idspecialiste AND doublon.idtype = p.idtype;
Sélection des doublons avec comptage sur (idspecialiste,idtype) et jointure sur la table personne.
bretus est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/06/2011, 17h55   #8
Membre émérite
 
Homme Olivier Dehorter
Ingenieur de recherche - Ecologue
Inscription : juin 2003
Messages : 697
Détails du profil
Informations personnelles :
Nom : Homme Olivier Dehorter
Localisation : France

Informations professionnelles :
Activité : Ingenieur de recherche - Ecologue

Informations forums :
Inscription : juin 2003
Messages : 697
Points : 837
Points : 837
et pourquoi pas :


Code SQL :
1
2
3
4
5
6
7
SELECT *
  FROM (SELECT T1.Idspecialite,
               T1.Idtype
          FROM Personne T1
          GROUP BY T1.Idspecialite, T1.Idtype
          HAVING COUNT(*) > 1) AS S
    INNER JOIN Personne T2 ON (T2.Idspecialite = S.Idspecialite AND T2.Idtype = S.Idtype)
dehorter olivier est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 03/06/2011, 18h25   #9
Candidat au titre de Membre du Club
 
Homme Allouchi
Développeur informatique
Inscription : janvier 2007
Messages : 40
Détails du profil
Informations personnelles :
Nom : Homme Allouchi
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Développeur informatique
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : janvier 2007
Messages : 40
Points : 14
Points : 14
Envoyer un message via MSN à allouchi
Citation:
Envoyé par bretus Voir le message
Spécifique à MySQL, elle agrège les résultats.

Si vous avez besoin des résultats sur plusieurs lignes, ça ressemblerait plutôt à cela avec un sub-select :

Code :
1
2
3
4
 
SELECT p.idpersonne,p.idspecialiste,p.idtype 
	FROM ( SELECT idspecialiste,idtype,count(idpersonne) AS num_occurence FROM personne p1 GROUP BY idspecialiste,idtype HAVING count(idpersonne) > 1 ) AS doublon
		LEFT JOIN personne p ON doublon.idspecialiste = p.idspecialiste AND doublon.idtype = p.idtype;
Sélection des doublons avec comptage sur (idspecialiste,idtype) et jointure sur la table personne.
Merci, c'est exactement ce que je veux. Il me reste à tester cette requete sur une base sous postgrès.
Merci beaucoup.
allouchi est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/06/2011, 18h34   #10
Membre éclairé
 
Inscription : mars 2009
Messages : 228
Détails du profil
Informations forums :
Inscription : mars 2009
Messages : 228
Points : 318
Points : 318
De rien,

Celle-ci je l'ai testée sous postgres

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



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


 
 
 
 
Partenaires

Hébergement Web