Поскольку это очень популярная тема, и хорошие ответы распространяются повсюду и рассматриваются в большой степени, я счел оправданным составить хорошие ответы от других в более сжатые формы, так что новички имеют простой обзор upfront:
Попробуйте следующий запрос: это ваш запрос, но он немного изменен для целей тестирования (он не использует таблицу ABC и генерирует только 10 строк, используя предложение CONNECT BY LEVEL <= 10
- но вы можете заменить 10 на 1000)
WITH My_Query As (
select random_group, count(random_group) as freq
from
(select case when rand_num >= 0 and rand_num<=0.053 then 1
when rand_num > 0.053 and rand_num <= 0.097 then 2
when rand_num > 0.097 and rand_num <= 0.142 then 3
when rand_num > 0.142 and rand_num <= 0.189 then 4
when rand_num > 0.189 and rand_num <= 0.234 then 5
when rand_num > 0.234 and rand_num <= 0.281 then 6
when rand_num > 0.281 and rand_num <= 0.341 then 7
when rand_num > 0.341 and rand_num <= 0.399 then 8
when rand_num > 0.399 and rand_num <= 0.458 then 9
when rand_num > 0.458 and rand_num <= 0.515 then 10
when rand_num > 0.515 and rand_num <= 1.000 then 11 end
random_group
from
(SELECT dbms_random.value(0,1) AS rand_num,
rownum as at_row_num
FROM dual
CONNECT BY LEVEL <= 10))
group by random_group
order by random_group
)
SELECT * FROM (
SELECT level as test_number FROM dual
CONNECT BY LEVEL <= 100
) row_generator,
LATERAL (
SELECT * FROM My_Query WHERE row_generator.test_number = row_generator.test_number
) x
;
Кстати: этот пункт WHERE row_generator.test_number = row_generator.test_number
представляется излишним, но без этого вы получите неправильные результаты - одни и те же записи повторяются 100 раз вместо случайных данных для каждого теста.