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?
6 Réponses :
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
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
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;
J'aime le nom 'find_a_better_way' :-)
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
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);
Simplement étendre votre requête SQL
SELECT * from Table where C2 in (SELECT c2 FROM Table group by c2 having count(c2)>1);
Avec EXISTS:
select * from table t where exists ( select 1 from table where c1 <> t.c1 and c2 = t.c2 )
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.
c1est-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.