2009-11-26 6 views
10

J'ai une table comme ceci:... où count (col)> 1

+-----+-----+-------+ 
| id | fk | value | 
+-----+-----+-------+ 
| 0 | 1 | peter | 
| 1 | 1 | josh | 
| 3 | 2 | marc | 
| ... | ... | ... | 

Je voudrais maintenant obtenir toutes les entrées qui ont plus d'une valeur. Le résultat attendu serait:

+-----+-------+ 
| fk | count | 
+-----+-------+ 
| 1 | 2  | 
| ... | ... | 

J'ai essayé d'y parvenir comme ceci:

select fk, count(value) from table where count(value) > 1; 

Mais Oracle ne l'aimaient pas.

J'ai donc essayé cette ...

select * from (
    select fk, count(value) as cnt from table 
) where cnt > 1; 

... sans succès.

Des idées? Utiliser la clause having pour comparer des agrégats.

+0

Pouvez-vous donner les messages d'erreur? – bayer

Répondre

30

De même, vous devez regrouper par rapport à ce que vous agrégez pour que la requête fonctionne correctement. Ce qui suit est un début, mais comme il vous manque une clause group by, cela ne fonctionnera pas tout à fait. Qu'essayez-vous exactement de compter?

select fk, count(value) 
from table 
group by fk 
having count(value) > 1; 
+3

N'y at-il pas un 'group by' manquant? 'select fk, count (*) du groupe de tables par fk ayant count (*)> 1' – Dirk

+0

Je n'ai jamais entendu parler de" avoir "en SQL mais c'était ce que je cherchais. Je vous remercie! – cimnine

+0

@Dirk: Oui, Oracle s'est plaint à ce sujet. J'ai ajouté le 'group by fk' à la fin pour le faire fonctionner; Je ne sais pas si c'est important si c'est avant ou après le 'avoir'. – cimnine