Почему функция подсчета в SQL, кажется, делает больше, чем просто подсчитывает столбец, к которому я обращаюсь? - PullRequest
0 голосов
/ 15 июля 2009

У меня есть запрос INSERT, который извлекает данные из двух таблиц и вставляет эти данные в третью таблицу. Кажется, все работает нормально, за исключением того, что часть запроса COUNT не возвращает ожидаемых результатов.

Первый набор таблиц, к которым запускается этот запрос: MIUsInGrid1000 (количество строк = 1) и Results1000 (количество строк = 24). Число, возвращаемое частью запроса Count, равно 24, а не 1, как я ожидал.

Следующий набор таблиц: MIUsInGrid1000 (количество строк = 3) и Results1000 (количество строк = 30). Число, которое возвращается из части запроса Count, равно 90, а не 3, как я ожидал.

Похоже, что произведение двух пунктов возвращается ко мне, и я не могу понять, почему это так. Если я уберу ссылки на таблицы Results, тогда запрос будет работать так, как я ожидал. Я думаю, что я неправильно понимаю, как хоть какая-то часть этого работает. Может кто-нибудь объяснить, почему это не работает, как я ожидал?

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 & " "

Ответы [ 3 ]

3 голосов
/ 15 июля 2009

Мне кажется логичным, что если вы объединяете две таблицы, одна с 1 строкой, а другая с 24 строками, существует вероятность, что результирующий набор будет состоять из 24 строк.

Я заметил, что вы не включили предложение WHERE в свой SQL (возможно, для краткости), но если у вас его нет, вы выполняете CROSS JOIN (или декартово соединение) между таблицами, и это даст неожиданные результаты.

Функция COUNT будет подсчитывать все строки в базе данных, чтобы определить, сколько существует «различных» идентификаторов, вы можете использовать ответ, предоставленный Tomalak

2 голосов
/ 15 июля 2009

Это должно решить вашу непосредственную проблему

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

Голая функция COUNT подсчитывает не- NULL значения, а не отдельные значения, если только вы не скажете ей переключать поведение с помощью DISTINCT.

Когда две таблицы объединяются так, как вы это делаете (вы строите декартово произведение), то количество результирующих строк - это количество строк, в один раз превышающее количество строк в другой таблице.

Это приводит меня к подозрению, что вы пропустили условие соединения.

Кроме того, меня удивляет, что у вас есть ряд явно идентичных таблиц, которые индексируются по имени. Это, безусловно, является существенным недостатком дизайна в базе данных.

1 голос
/ 15 июля 2009

Я обычно выясняю эти вещи, чтобы не использовать какие-либо агрегаты в первую очередь, чтобы увидеть, какими будут мои наборы результатов. Затем я начинаю добавлять в агрегатные функции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...