общее количество строк запроса - PullRequest
1 голос
/ 14 декабря 2010

У меня очень большой запрос, который должен возвращать только первые 10 результатов:

выберите лучшие 10 ProductId из .....

Проблема заключается в том, что я также хочуобщее количество результатов, которые соответствуют критериям без этой «первой десятки», но в то же время считается недопустимым возвращать все строки (мы говорим о примерно 100 тысячах результатов.

Есть ли способ получитьобщее количество строк, затронутых предыдущим запросом, в нем или в последующих словах без повторного его выполнения?

PS: пожалуйста, не используйте временные таблицы из 100 000 строк:))

Ответы [ 4 ]

4 голосов
/ 14 декабря 2010

сбросить счетчик в переменной и вернуть, что

declare @count int
select @count = count(*) from ..... --same where clause as your query

--now you add that to your query..of course it will be the same for every row..
select top 10 ProductId, @count as TotalCount from .....
2 голосов
/ 14 декабря 2010

Предполагая, что вы уже используете предложение ORDER BY (чтобы правильно определить, какие результаты «ТОП 10»), вы можете добавить вызов ROW_NUMBER также с противоположным порядком сортировки и выбрать самое высокое возвращаемое значение .

Например, следующее:

select top 10 *,ROW_NUMBER() OVER (order by id desc) from sysobjects order by ID

Имеет последний столбец со значениями 2001, 2000, 1999 и т. Д. По убыванию. И следующее:

select COUNT(*) from sysobjects

Подтверждает, что в системных объектах есть 2001 строк.

0 голосов
/ 14 декабря 2010

Вообще говоря нет - рассуждения таковы:

Если (!) Планировщик запросов может использовать TOP 10 для возврата только 10 строк, тогда СУБД даже не будет знать точное количество строк, удовлетворяющих полному критерию, она просто получит TOP 10 .

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

Сказав, что правильные индексы могут заставить оба запроса выполняться довольно быстро.

Редактировать
MySQL имеет SQL_CALC_FOUND_ROWS , который возвращает число строк, которые запрос вернул бы, если бы не было применено LIMIT - поиск в Google для эквивалента в MS SQL указывает на аналитический вариант SQL и CTE, см. этот форум (хотя и не уверен, что любой из них будет квалифицирован как запускающий его только один раз, но не стесняйтесь проверять - и дайте нам знать).

0 голосов
/ 14 декабря 2010

Полагаю, вы можете взломать его с помощью выбора объединения

select top 10 ... from ... where ...
union
select count(*) from ... where ...

Для того, чтобы избежать такого типа взлома, вам нужно будет добавить поддельные столбцы в запрос подсчета, чтобы он возвращал то же количество столбцов, что и основной запрос. Например:

select top 10 id, first_name from people
union
select count(*), '' as first_name from people

Я не рекомендую использовать это решение. Как это сделать, используя два отдельных запроса

...