Для пары курсоров, где общее количество строк в наборе результатов сразу требуется после первой ВЫБОРКИ, (после некоторых эмпирических) я придумал запрос ниже
SELECT
col_a,
col_b,
col_c,
COUNT(*) OVER( PARTITION BY 1 ) AS rows_in_result
FROM
myTable JOIN theirTable ON
myTable.col_a = theirTable.col_z
GROUP BY
col_a, col_b, col_c
ORDER BY
col_b
Теперь, когда вывод запроса является X строками, rows_in_result отражает это точно.
Это необычное использование PARTITION BY. Что он делает, так это помещает все в один и тот же раздел, так что если запрос возвращает всего 123 строки, тогда значение rows_in_result в каждой строке будет 123 (как следует из его псевдонима).
Таким образом, это эквивалентно более краткому:
COUNT(*) OVER ()