как дублировать мои результаты sql?

Я хочу получить несколько результатов из одной строки в таблице на основе номера этой таблицы.

ID | count
A  | 12
B  | 138

Поэтому я хочу, чтобы результат запроса был 12 раз A (независимо от того, со счетчиком или нет) и 138 раз B. Я видел решение, добавив таблицу счетчиков в БД, но я не могу этого сделать.


person ainhoa sayans    schedule 25.11.2016    source источник
comment
Можете показать пример результата?   -  person RedLens834    schedule 25.11.2016
comment
Есть ли код, который вы пробовали?   -  person Sefe    schedule 25.11.2016
comment
Я пытался использовать некоторые двойные трюки, но ответ Mt() работает отлично.   -  person ainhoa sayans    schedule 01.12.2016


Ответы (1)


Вы можете использовать коррелированный иерархический запрос:

SELECT t.id, r.COLUMN_VALUE, t.cnt
FROM   table_name t
       CROSS JOIN
       TABLE(
         CAST(
           MULTISET(
             SELECT LEVEL
             FROM   DUAL
             CONNECT BY LEVEL <= t.cnt
           )
           AS SYS.ODCINUMBERLIST
         )
       ) r;

или предложение факторинга рекурсивного подзапроса:

WITH row_generator ( id, lvl, cnt ) AS (
  SELECT id, 1, cnt
  FROM   table_name
UNION ALL
  SELECT id, lvl + 1, cnt
  FROM   row_generator
  WHERE  lvl < cnt
)
SELECT *
FROM   row_generator
ORDER BY id, lvl

Итак, для тестовых данных:

CREATE TABLE table_name ( ID, cnt ) AS
SELECT 'A',  12 FROM DUAL UNION ALL
SELECT 'B', 138 FROM DUAL

Оба этих решения будут выводить:

ID | COLUMN_VALUE | CNT
:- | -----------: | --:
A  |            1 |  12
A  |            2 |  12
A  |            3 |  12
          ...
A  |           10 |  12
A  |           11 |  12
A  |           12 |  12
B  |            1 | 138
B  |            2 | 138
B  |            3 | 138
B  |            4 | 138
          ...
B  |          136 | 138
B  |          137 | 138
B  |          138 | 138

db‹>скрипка здесь

person MT0    schedule 25.11.2016
comment
все отлично работает, спасибо, но я должен поставить r. * потому что таблица не дает имени столбца. - person ainhoa sayans; 25.11.2016
comment
Имя сгенерированного столбца — COLUMN_VALUE, но вы можете присвоить ему любое другое имя. - person MT0; 25.11.2016