Как выбрать TOP x, но при этом получить ПОДСЧЕТ всего запроса?

#sql #sql-server

#sql #sql-сервер

Вопрос:

Я пишу веб-страницу для интерактивной фильтрации результатов на основе критериев фильтрации, указанных пользователем. Я хочу вернуть из SQL только 20 ПЕРВЫХ строк, но я хочу знать, сколько строк соответствует критериям (количество). Я хочу иметь возможность сообщить пользователю: «Вот 20 лучших строк, соответствующих вашим критериям, и, кстати, было 2000 дополнительных строк, которые я здесь не показываю».

Я знаю, что мог бы просто запустить запрос дважды, но EWWWW это дорого и расточительно. Как я могу добиться того, чего хочу, не перегружая базу данных?

Ответ №1:

Вы можете использовать COUNT(*) OVER()

 SELECT TOP 20 *, 
       COUNT(*) OVER() AS TotalMatchingRows
FROM master..spt_values
WHERE type='P'
ORDER BY number
  

Однако выполнение двух запросов может оказаться более эффективным, особенно если у вас более узкие индексы, которые можно использовать для определения количества совпадающих строк, но не охватывают весь SELECT список.

Комментарии:

1. Я идиот, ты мастер дзен. 🙂 Я люблю экспертов по SQL, никаких излишеств, только факты. Спасибо, Мартин.

Ответ №2:

выберите COUNT(*) из Process_Master, где dt_time=(выберите top 1 (dt_time) из Process_Master order по DT_TIME desc)