2009-11-09 2 views
2

J'ai essentiellement le même problème décrit dans this question, mais j'utilise Microsoft Access comme une base de données au lieu de MySQL. Le résultat est que SQL_CALC_FOUND_ROWS ne semble pas être disponible pour moi. Croyez-moi, je veux changer, mais pour l'instant c'est hors de question.Obtenir le nombre de lignes dans un groupe par requête avec Microsoft Access

J'ai une requête qui agrège un certain nombre de lignes, recherchant essentiellement des lignes de répétition basées sur certaines clés, en utilisant un groupe par. Cela ressemble à ceci:

Select key1, key2, key3, Count(id) 
from table 
group by key1, key2, key3 
having Count(id) > 1 

J'ai besoin de déterminer le nombre de lignes (ou de regroupements) que la requête retournera.

La base de données est accessible via Java, donc en théorie je pourrais simplement exécuter la requête, et la parcourir deux fois, mais j'espérais quelque chose de plus rapide et de préférence basé sur SQL. Des idées?

Répondre

3

Le nombre d'enregistrements de MS Access devrait vous donner ce dont vous avez besoin, ou ai-je oublié quelque chose?

Si vous avez besoin de valeurs distinctes de clés, essayez cette

SELECT COUNT(*) AS Expr2 
    FROM (
     SELECT DISTINCT [key1] & "-" & [key2] & "-" & [key3] AS Expr1 
      FROM Table1 
     ) AS SUB; 
+0

* La base de données est accessible via Java * mais je suppose que Java a un équivalent de RecordCount – Andomar

+0

Pouvez-vous élaborer? Comment puis-je voir le nombre d'enregistrements? Notez que j'y accède via Java et non par le frontal Access ... –

+0

@Andomar Non, ce n'est pas le cas. Il n'y a aucun moyen de faire en sorte que l'enregistrement compte à partir d'un objet ResultSet Java. –

0

Lorsque vous créez l'objet Statement, vous pouvez le déclarer soit déroulable. Ensuite, la première chose que vous faites est de faire défiler jusqu'à la fin et d'obtenir le numéro d'enregistrement. Comme vous regardez le dernier enregistrement, ce sera le nombre d'enregistrements dans le jeu de résultats. Puis revenez au début et traitez normalement. Quelque chose comme:

Statement st=connection.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY); 
ResultSet rs=st.executeQuery(myQueryString); 
boolean any=rs.last(); 
int count = any ? count=getRow() : 0; 
... do whatever with the record count ... 
rs.first(); 
while (rs.next()) 
{ 
... whatever processing you want to do ... 
} 
rs.close(); 
... etc ... 

Je ne sais pas ce que les conséquences sur les performances de le faire avec MS Access sera, si elle peut aller directement à la fin du jeu de résultats ou si elle devra lire séquentiellement tous les enregistrements . Néanmoins, cela devrait être plus rapide que d'exécuter la requête deux fois.

+0

J'ai trouvé cette réponse à plusieurs endroits, mais la valeur renvoyée par getRow était erronée (dans les milliers, elle devrait être des centaines). Et pour une raison inconnue - probablement un problème avec l'accès - le défilement semblait bousiller le curseur. –

+0

Hmm. J'ai utilisé getRow plusieurs fois avec MySQL et Oracle et ça a toujours bien fonctionné. Je suppose qu'il est possible qu'il y ait un bogue dans MS Access ou le pilote JDBC. Ma première pensée serait de faire le dernier/getRow et vérifier le compte, lire un champ d'identification dans cet enregistrement et le vider, puis faire d'abord et en boucle le comptage des enregistrements. Si last/getRow dit vraiment 1000 mais que la boucle ne fait que trouver 100 ou autre, comme wow, c'est bizarre. Je ferais des tests pour être très sûr avant de conclure qu'il y avait un bug flagrant. – Jay