I was having a look at this question: Getting random value from a SQLite table and it got me wondering if one can duplicate records using SQL. More specifically, is there a
What SQL dialect and version? It can eaily be done with a recursive CTE.
WITH cte AS (
SELECT id, name, count FROM tbl
UNION ALL
SELECT id, name, count-1 FROM cte WHERE count>1
)
SELECT id, name FROM cte
You can use a "numbers" table (it's handy for various operations):
CREATE TABLE num
( i UNSIGNED INT NOT NULL
, PRIMARY KEY (i)
) ;
INSERT INTO num (i)
VALUES
(1), (2), ..., (1000000) ;
Then:
SELECT
t.id, t.name
FROM
tableX AS t
JOIN
num
ON num.i <= t."count"
Warning: There is of course a limitation on this approach. The query will not produce all the wanted rows, as soon as you have a value in the count
column that exceeds the maximum value stored in the Numbers table. If the values in the count
column are unbounded, then only an iterative or recursive solution (like the other two answers) can work.
This can be done using a recursive CTE:
;WITH CTE_Data as (
select id=1, name='Anne',[COUNT]=3
union select id=2, name='Joe',[COUNT]=2
),
CTE_List as (
select
id,
name,
ind=1
from CTE_Data
union all
select
l.id,
l.name,
ind=ind+1
from CTE_List l
join CTE_Data d on l.id = d.id
where
l.ind < d.[count]
)
select id,name from CTE_List
order by id,ind
NOTE: CTE_List is the interesting one, CTE_Data is just the source data for testing.