2014-02-06 4 views
2

есть лучший способ для создания [0 ... 9999], чем это:генерировать 10000 последовательных целых чисел

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 

Любая обратная связь оценена.

+3

http://www.sqlperformance.com/2013/01/t-sql-queries/ generate-a-set-1 –

+0

Возможный дубликат [SQL, Вспомогательная таблица чисел] (http://stackoverflow.com/questions/10819/sql-auxiliary-table-of-numbers) –

+0

Я не думаю, что это правда. Я задаю очень конкретный вопрос, тогда как другой очень общий ... – cs0815

ответ

2

Вы могли бы написать это следующим образом:

;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 

Удалив заказ вы получили немного.

0

Я не знаю, почему этот ответ был удален из POST, в этом также произвел желаемый результат

;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 
+0

Я удалил свой пост, потому что он не работает в sql-сервере 2005. Переписал его –

+0

Да, это правильно, он работает с 2008 и выше –

+0

Получите синтаксические ошибки для что один ... – cs0815

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) 
+0

Если вы посмотрите на ссылку @ TimSchmelter. Вы увидите, что производительность для этого не так велика (14 milisecond vs 1 milisecond) –

Смежные вопросы