Вниз
Скачать: CL | DM;

Общий count...   Найти похожие ветки 

 
mOOx_ ©   (2003-08-23 14:34) [0]

Поясняю: есть класс а в нем процедура, в которую я передаю запрос. В ней заполняются поля этого самого класса, в том числе и count. Класс писался, когда в базе было макс. 400 записей. Поскольку свойство RecordCount в TIBQuery работает криво, то определение Count"а я делал так, Next до конца набора и Count:=RecordCount :). Когда я опробовал этот класс для того, чтобы достать 40000 записей, то просто за..... ждать. Значит вопрос в следующем: корректно ли для определения count"а вырезать из запроса все между select и from и вставлять на это место count(*)? При этом надо учесть, что запрос может быть давольно сложным :), возможны не только выборки из нескольких таблиц, но и вложенные запросы.


 
kaif ©   (2003-08-23 14:42) [1]

В принципе проблем не вижу. Должно работать. Почему бы нет?
Я еще не разу не сталкивался с проблемой того, чтобы нельзя было заменить возвращаемый набор полей на просто count(*). Если конечно, в запросе нет GROUP BY. Как известно, GROUP BY потребует перечисления того же набора неагрегатных полей после SELECT. Но я думаю, у тебя не тот случай. Удали еще из запроса ORDER BY, если такое там присуствует.


 
Vorobyev Sergey   (2003-08-23 14:43) [2]


> Поскольку свойство RecordCount в TIBQuery работает криво

Оно не работает криво, просто TIBQuery отбирает не все записи,
и чтобы RecordCount вернул все записи надо:
IBQuery1.FetchAll;
n := IBQuery.RecordCount



> корректно ли для определения count"а вырезать из запроса
> все между select и from и вставлять на это место count(*)?

Не корректно..
Для каждого запроса по разному.. Здесь нужен специальный анализатор (парсер), который бы для ЛЮБОГО запроса составлял запрос для подсчета количества записей.. Честно говоря, я такого анализатора не встречал, да и боюсь его невозможно создать из-за того, что даже вручную не для любого запроса можно создать такой..


 
kaif ©   (2003-08-23 14:44) [3]

И еще. Если в запросе возможен UNION, то идея работать не будет. Или же надо будет везде после SELECT вставлять COUNT(*), а потом на клиенте еще раз суммировать результат.


 
kaif ©   (2003-08-23 14:46) [4]

2 Vorobyev Sergey (23.08.03 14:43) [2]
Ты можешь привести пример, когда нельзя так поступить?
(без GROUP BY и ORDER BY)


 
Vorobyev Sergey   (2003-08-23 14:50) [5]


> Ты можешь привести пример, когда нельзя так поступить?
> (без GROUP BY и ORDER BY)

Пример, не могу..
Я только предполагаю, это гипотеза если хотите.. (я же написал ".. боюсь его невозможно создать..")

Но можно объявить конкурс: "Кто составит запрос, к которому нельзя будет составить запрос на подсчет количества записей"


 
mOOx_ ©   (2003-08-23 15:03) [6]

Отличная идея про конкурс :). Буду думать. А свой способ я всетаки попробую потестить. Вообщем то пока запросы не такие уж и сложные (по крайней мере нет union и order). Если найду проблему - сразу отпишу. А вообще спасибо за заботу о ближнем :)



Страницы: 1 вся ветка

Скачать: CL | DM;



Память: 0.46 MB
Время: 0.025 c
3-48422
Miau
2003-08-23 14:42
2003.09.15
ADO & DLL


3-48395
mihnik
2003-08-26 09:19
2003.09.15
Аналог RxMemoryTable не используя BDE


1-48578
Vinter
2003-09-04 09:38
2003.09.15
Полупрозрачная форма


6-48672
eK
2003-07-14 22:32
2003.09.15
Как мне переделать аутентификацию на веб-сервере


3-48469
Slaviq
2003-08-21 18:01
2003.09.15
SQL запрос для объединения 2 таблиц




   Наверх