1
votes

doublons sql affichant toutes les données

Compte tenu de ces données

SELECT
    group, COUNT(*)
FROM
    people
GROUP BY
    group
HAVING 
    COUNT(*) > 1

Comment puis-je obtenir les valeurs en double affichant tous les champs? Le doublon est uniquement sur le groupe, l'identifiant et le nom ne seront pas des doublons.

Devrait finir par ressembler à l'un de ceux-là (n'importe lequel serait valide):

:::::::::::::::::::::::::::::::::::::::::::::::
group  count values

001     2     1,3

:::::::::::::::::::::::::::::::::::::::::::::::
id  name        group
1   Jhon        001
3   Mary        001

J'ai essayé avec

id  Name        group           

1   Jhon        001

2   Paul        002

3   Mary        001


2 commentaires

le second est juste SELECT * FROM people WHERE [group] = '001'


Double possible de Comment concaténer plusieurs lignes avec le même identifiant dans sql?


4 Réponses :


1
votes

Essayez ceci.

SELECT Id, Name, [Group] 
FROM people
WHERE [Group] IN(
    SELECT [Group]
    FROM people
    GROUP BY [Group]
    HAVING COUNT(*) > 1)


0 commentaires

1
votes

Je ferais une requête interne pour trouver les groupes avec plus d'un membre, puis j'utiliserais cette requête interne pour ramener une liste des noms.

Par exemple:

SELECT Id, Name, group
FROM people
WHERE group in
   (SELECT group
    FROM people
    GROUP BY group
    HAVING count(*) > 1);


2 commentaires

En quoi cela diffère-t-il de la réponse précédente autre que le commentaire / texte, peut-être simplement suggérer cet ajout à la réponse précédente?


Ce n'est pas le cas. Je pense que nous avons tous les deux répondu en même temps.



1
votes

Évitez d'utiliser Group car il s'agit d'un mot-clé réservé dans SQL:

 SELECT *
    FROM MyTable
    WHERE groups IN(
        SELECT groups
        FROM MyTable
        GROUP BY groups
        HAVING COUNT(*) > 1)  

Vérifier l'exécution ici


0 commentaires

1
votes

Utilisez simplement exists:

select p.*
from people p
where exists (select 1
              from people p2
              where p2.group = p.group and
                    p2.id <> p.id
             );

Cela devrait être la solution la plus performante. Avec un index sur personnes (groupe, id) , il devrait avoir de très bonnes performances.

Note: Tous les conseils pour éviter d'utiliser group comme un le nom de la colonne est un bon conseil. Vous devriez changer le nom.


0 commentaires