2009-07-15 4 views
-1

J'ai une requête INSERT qui extrait des données de deux tables et insère ces données dans une troisième table. Tout semble fonctionner correctement, sauf que la partie COUNT de la requête ne renvoie pas les résultats que je m'attendais.Pourquoi la fonction count de SQL semble-t-elle faire plus que de compter la colonne à laquelle je la demande?

Le premier ensemble de tables exécuté par cette requête est MIUsInGrid1000 (nombre de lignes = 1) et Results1000 (nombre de lignes = 24). Le nombre renvoyé par la partie Count de la requête est 24 au lieu d'être 1 comme je l'aurais espéré.

La prochaine série de tables est MIUsInGrid1000 (nombre de lignes = 3) et Results1000 (nombre de lignes = 30). Le nombre qui est renvoyé à partir de la partie Count de la requête est 90 au lieu d'être 3 comme je l'aurais prévu.

Il semble que le produit des deux comptages soit ce qui me revient et je n'arrive pas à comprendre pourquoi. Si je supprime les références aux tables Results, la requête fonctionne comme je le souhaitais. Je pense que je ne comprends pas comment au moins une partie de cela fonctionne. Quelqu'un peut-il expliquer pourquoi cela ne fonctionne pas comme je m'y attendais?

strQuery1 = "Insert Into MIUsInGridAvgs (NumberofMIUs, ProjRSSI, RealRSSI, CenterLat, CenterLong) " & _ 
      "Select Count(MIUsInGrid" & i & ".MIUID), Avg(MIUsInGrid" & i & ".ProjRSSI), Avg(MIUsInGrid" & i & ".RealRSSI), Avg(Results" & i & ".Latitude), Avg(Results" & i & ".Longitude) " & _ 
      "From MIUsInGrid" & i & ", Results" & i & " " 
+0

vous ne spécifiez pas quel DMBS vous utilisez ... – Javier

+0

@Javier: Regardez les étiquettes! : D – Tomalak

+0

vous joignez 2 tables sans prédicat de jointure, donc vous allez obtenir le produit de jointure croisée des deux. –

Répondre

3

Il me semble logique que si vous joignez deux tables, une avec 1 ligne et l'autre avec 24 lignes qu'il y a, c'est la possibilité, d'avoir un jeu de résultats de 24 lignes.

Je remarque que vous n'avez pas inclus une clause WHERE dans votre SQL (peut-être pour la brièveté), mais si vous n'avez pas ce que vous faites un CROSS JOIN (ou cartésienne) entre les tables et cela donnera des résultats inattendus .

La fonction COUNT comptera toutes les lignes dans la base de données, afin de déterminer combien il y de ID sont « distincts », vous pouvez utiliser la réponse fournie par Tomalak

2

Cela devrait résoudre votre problème immédiat

Count(DISTINCT MIUsInGrid" & i & ".MIUID) 

La fonction COUNT nue compte les valeurs non NULL, pas les distinctes des valeurs, à moins que vous dites à changer le comportement en utilisant DISTINCT . Lorsque deux tables sont jointes comme vous le faites (vous construisez un produit cartésien), alors le nombre de lignes résultantes est le nombre de lignes dans une fois le nombre de lignes dans l'autre table. Cela m'amène à la suspicion qu'il vous manque une condition de jointure. En dehors de cela je trouve déconcertant que vous ayez un certain nombre de tables évidemment identiques qui sont indexées par nom. Ceci est certainement un défaut de conception important dans la base de données.

+0

+1 pour déroutant ;-) –

+0

J'ai essayé différentes variantes de ceci et ai continué à obtenir une erreur en disant qu'il y avait une erreur de syntaxe avec cela. Je suis même allé jusqu'à essayer de placer toute une sous-requête Select Distinct à l'intérieur de Count() mais cela renvoyait la MIUID réelle au lieu du nombre de celle-ci. – Bryan

1

La façon dont je figure habituellement ces choses est de ne pas utiliser tout agrégats d'abord pour voir ce que mes ensembles de résultats seront. Ensuite, je commence à ajouter dans les fonctions d'agrégat.

+0

Hors sujet mais vous ne seriez pas d'être lié à un Tim DeVore le feriez-vous? Je travaillais avec un Tim DeVore à l'usine Michelin d'Opelika. – Bryan

+0

Non. Eh bien, au moins pas que je sache. Peut-être devrions-nous demander à Kevin Bacon. –