Одиночный выбор для генерации строк по столбцу TableA.quantity. Используется только ISO / ANSI SQL Standard синтаксис 2003 (БД должна поддерживать оконную функцию).
Таблица A определение:
|----|----------|---------------|
| id | quantity | another_value |
|----|----------|---------------|
| 1 | 3| value_a |
| 2 | 2| value_b |
| 3 | 6| value_c |
|----|----------|---------------|
CREATE TABLE TableA AS
(SELECT 1 as ID, 3 AS quantity, 'value_a' AS another_value
UNION SELECT 2, 2, 'value_b'
UNION SELECT 3, 6, 'value_c');
Следующий запрос можно использовать для значения количества до 1000. Для количества до 10000 расширить запрос оператором CROSS JOIN ten AS rank10000
...
SELECT
ROW_NUMBER() OVER(order by id) as unique_id,
id as original_id,
another_value || ROW_NUMBER() OVER (PARTITION BY id) as another_value
FROM TableA
INNER JOIN
(SELECT row_number() OVER () AS rnum FROM
(WITH ten AS (SELECT 1 AS id UNION SELECT 2
UNION SELECT 3 UNION SELECT 4
UNION SELECT 5 UNION SELECT 6
UNION SELECT 7 UNION SELECT 8
UNION SELECT 9 UNION SELECT 10)
SELECT *
FROM ten AS rank10
CROSS JOIN ten AS rank100
CROSS JOIN ten AS rank1000
) helper
) help ON help.rnum <= TableA.quantity
Результат SQL:
|-----------|-------------|---------------|
| unique_id | original_id | another_value |
|-----------|-------------|---------------|
| 1 | 1 | value_a1 |
| 2 | 1 | value_a2 |
| 3 | 1 | value_a3 |
| 4 | 2 | value_b1 |
| 5 | 2 | value_b2 |
| 6 | 3 | value_c1 |
| 7 | 3 | value_c2 |
| 8 | 3 | value_c3 |
| 9 | 3 | value_c4 |
| 10 | 3 | value_c5 |
| 11 | 3 | value_c6 |
|-----------|-------------|---------------|
Должно работать на PostgreSQL, Oracle или MSSQL (протестировано на PostgreSQL 9.0)
Отредактировано:
Оптимизированный запрос с использованием оператора WITH RECURSIVE (идея из MatBailie):
SELECT
ROW_NUMBER() OVER() as unique_id,
id as original_id,
another_value || ROW_NUMBER() OVER (PARTITION BY id) as another_value
FROM
(WITH RECURSIVE helper AS
(SELECT id, quantity, another_value FROM TableA
UNION ALL
SELECT id, quantity-1, another_value FROM helper WHERE quantity > 1
) SELECT * FROM helper ORDER BY id, quantity
) TableB