1
votes

SQL liste tous les doublons

Voici le problème de la manière la plus simple possible:

Supposons que j'ai une base de données avec 2 colonnes, c1 et c2. Je voudrais obtenir une liste de toutes les lignes où la valeur dans c2 apparaît plusieurs fois. Par exemple:

c1  c2
1   4

Je veux que la sortie soit:

c1  c2
3   4

Puisque ce n'est que dans ces lignes que la valeur de c2 apparaissent plus d'une fois.

J'ai essayé la requête suivante:

SELECT * FROM Table
group by c2
having count(c2)>1;

Le problème est que cela se réduit en une seule ligne, soit

c1  c2
1   4
3   4

ou

c1  c2
1   4
2   3
3   4

Cependant, comme les valeurs de c1 sont uniques, je veux que les deux lignes apparaissent. Comment puis-je faire cela?


5 commentaires

c1 est-il unique?


Pas nécessairement, mais si vous aviez une réponse en supposant qu'elle était unique, ce serait toujours très utile


Eh bien, vous êtes à mi-chemin d'une solution possible. Si vous saviez que les JOINs pouvaient jouer un rôle, pourriez-vous trouver le reste?


@Strawberry une solution de jointure serait-elle plus efficace que la réponse actuellement sélectionnée?


Probablement. Facile à découvrir.


6 Réponses :


1
votes

Vous devrez peut-être utiliser une requête de requête pour l'obtenir.

SELECT c1, c2 
  FROM my_table
  WHERE c2 IN 
  (SELECT c2 
    FROM my_table 
    GROUP BY c2
    HAVING count(c2)>1)
      ORDER BY c2, c1

@Eduardo Silva vous avez raison. La sélection doit provenir de la table d'origine:

SELECT c1, c2 FROM
  (SELECT c1, c2, count(c2) AS B 
    FROM Table 
    GROUP BY c2) AS A
      WHERE A.B > 1 
      ORDER BY A.c2, A.c1


2 commentaires

Astuce: vous pouvez , mais vous n'êtes certainement pas obligé


Qui veulent du travail. Vous sélectionnez les colonnes c1 et c2 et regroupez uniquement par c2



1
votes

Je pense que cela fonctionne, mais il existe probablement un meilleur moyen:

SELECT C1, C2 AS find_a_better_way FROM tbl WHERE (SELECT COUNT(*) FROM tbl WHERE C2=find_a_better_way LIMIT 2) = 2;


1 commentaires

J'aime le nom 'find_a_better_way' :-)



2
votes

Vous pouvez faire quelque chose comme ceci:

SELECT A.* FROM TABLE A
INNER JOIN 
(SELECT C2 FROM TABLE
group by c2
having count(c2)>1) B ON A.C2 = B.c2


0 commentaires

1
votes

Je ceci est raisonnablement élégant et fera l'affaire:

SELECT c1,c2 FROM test.`table`
WHERE c2 in (SELECT c2 FROM test.`table`
group by c2
having count(c2)>1);


0 commentaires

3
votes

Simplement étendre votre requête SQL

SELECT * from Table where C2 in 
(SELECT c2 FROM Table
group by c2
having count(c2)>1);


0 commentaires

1
votes

Avec EXISTS:

select * from table t
where exists (
  select 1 from table
  where c1 <> t.c1 and c2 = t.c2
)


3 commentaires

C'est sympa, je ne vois pas beaucoup `` existe '' ces jours-ci :-)


Ah bon? C'est très efficace.


Ouais, je l'aime bien pour les scripts de migration de données, ça marche bien pour voir si une table ou une partition est peuplée.