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
4 Réponses :
Essayez ceci.
SELECT Id, Name, [Group]
FROM people
WHERE [Group] IN(
SELECT [Group]
FROM people
GROUP BY [Group]
HAVING COUNT(*) > 1)
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);
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.
É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
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.
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?