Выполнить запрос и COUNT запроса - PullRequest
1 голос
/ 07 марта 2019

Я пытаюсь создать запрос или код PL / SQL для выполнения запроса, а также для возврата количества результатов этого запроса.

Возможно ли это в одном запросе?Сейчас я чувствую себя очень расточительно: сначала я оборачиваю запрос в COUNT (без ORDER BY), а затем снова запускаю тот же запрос (без COUNT).Разница в несколько секунд, вероятно, не изменит общее количество строк, я могу жить с этим.Я использую БД Oracle Enterprise 12.2

Ответы [ 3 ]

7 голосов
/ 07 марта 2019

Простой способ SQL: тестовая таблица:

create table testTable(a, b, c) as (
    select 1, 'one',   'XX' from dual UNION ALL
    select 2, 'two',   'YY' from dual UNION ALL
    select 3, 'three', 'ZZ' from dual
)

Простой запрос:

select a, b, c
from testTable 

         A B     C 
---------- ----- --
         1 one   XX
         2 two   YY
         3 three ZZ

3 rows selected.

Запрос с количеством записей:

select a, b, c, count(*) over (partition by 1) as count
from testTable


         A B     C       COUNT
---------- ----- -- ----------
         1 one   XX          3
         2 two   YY          3
         3 three ZZ          3

3 rows selected.
1 голос
/ 07 марта 2019

Обычно, когда я делаю что-то подобное, я создаю хранимую процедуру, которая возвращает 2 значения. Первый будет результатом набора REF CURSOR, а другой номер (12,0), возвращающий счет. Конечно, оба этих запроса потребуют отдельных запросов, но поскольку они находятся в одной хранимой процедуре, выполняется только одно соединение с базой данных и команда.

Вы, конечно, правы, когда ваш запрос COUNT отказывается от предложения ORDER BY.

Чтобы ответить на ваш вопрос, вы не расточительны сами по себе. Это обычная практика в корпоративном программном обеспечении.

1 голос
/ 07 марта 2019

Вы можете попробовать сделать что-то вроде:

WITH test_query
  AS (SELECT LEVEL just_a_number
        FROM dual
       CONNECT BY level < 101)
SELECT just_a_number
     , COUNT(just_a_number) OVER (ORDER BY 1) total_count
  FROM test_query;

Где COUNT(just_a_number) OVER (ORDER BY 1) будет возвращать общее количество строк, извлеченных в каждой строке. Обратите внимание, что это может замедлить запрос.

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