2

Is there a better way to generate [0 ... 9999] than this:

SELECT
    (a3.id + a2.id + a1.id + a0.id) id
FROM
(   
    SELECT 0 id UNION ALL
    SELECT 1 UNION ALL
    SELECT 2 UNION ALL
    SELECT 3 UNION ALL
    SELECT 4 UNION ALL
    SELECT 5 UNION ALL
    SELECT 6 UNION ALL
    SELECT 7 UNION ALL
    SELECT 8 UNION ALL
    SELECT 9
) a0
CROSS JOIN
(
    SELECT 0 id UNION ALL
    SELECT 10 UNION ALL
    SELECT 20 UNION ALL
    SELECT 30 UNION ALL
    SELECT 40 UNION ALL
    SELECT 50 UNION ALL
    SELECT 60 UNION ALL
    SELECT 70 UNION ALL
    SELECT 80 UNION ALL
    SELECT 90
) a1
CROSS JOIN
(
    SELECT 0 id UNION ALL
    SELECT 100 UNION ALL
    SELECT 200 UNION ALL
    SELECT 300 UNION ALL
    SELECT 400 UNION ALL
    SELECT 500 UNION ALL
    SELECT 600 UNION ALL
    SELECT 700 UNION ALL
    SELECT 800 UNION ALL
    SELECT 900
) a2
CROSS JOIN
(
    SELECT 0 id UNION ALL
    SELECT 1000 UNION ALL
    SELECT 2000 UNION ALL
    SELECT 3000 UNION ALL
    SELECT 4000 UNION ALL
    SELECT 5000 UNION ALL
    SELECT 6000 UNION ALL
    SELECT 7000 UNION ALL
    SELECT 8000 UNION ALL
    SELECT 9000
) a3
ORDER BY id

Any feedback appreciated.

cs0815
  • 16,751
  • 45
  • 136
  • 299

3 Answers3

2

You could write it like this:

;WITH x as
(
  SELECT 0 id UNION ALL
  SELECT 1 UNION ALL
  SELECT 2 UNION ALL
  SELECT 3 UNION ALL
  SELECT 4 UNION ALL
  SELECT 5 UNION ALL
  SELECT 6 UNION ALL
  SELECT 7 UNION ALL
  SELECT 8 UNION ALL
  SELECT 9
)
SELECT
    row_number() over (order by (select 1))-1 id
FROM x a0
CROSS JOIN x a1
CROSS JOIN x a2
CROSS JOIN x a3

By removing the order by you gained a little.

t-clausen.dk
  • 43,517
  • 12
  • 59
  • 92
0

I am not sure why this answer was removed from POST, this also produced desired output

;WITH x as
(
    select id from 
    (values(0),(1),(2),(3),(4),(5),(6),(7),(8),(9)) x(id)
)
SELECT
    (a3.id * 1000 + 
    a2.id * 100 + a1.id * 10 + a0.id) id
FROM x a2
CROSS JOIN x a0
CROSS JOIN x a1
CROSS JOIN x a3
Naveen Kumar
  • 1,541
  • 10
  • 12
0
WITH a AS (
SELECT 0 AS a1
UNION ALL
SELECT a1+1 FROM a WHERE a1+1<10000
)
SELECT * FROM a
OPTION (Maxrecursion 10000)
Jayvee
  • 10,670
  • 3
  • 29
  • 40
  • If you look at @TimSchmelter's link. You will see that the performance for this is not that great (14 milisecond vs 1 milisecond) – t-clausen.dk Feb 06 '14 at 13:34