2009-11-27 3 views
0

Есть ли лучший способ генерации диапазона чисел в SQL, чем ниже? Я использую MySql.Создание диапазона чисел в подзапросе sql

SELECT tens.x + ones.x + 1 
FROM 
(SELECT 0 x UNION ALL 
SELECT 1 x UNION ALL 
SELECT 2 x UNION ALL 
... 
SELECT 9 x) ones 

CROSS JOIN 

(SELECT 0 x UNION ALL 
SELECT 10 x UNION ALL 
SELECT 20 x UNION ALL 
... 
SELECT 90 x) tens; 
+0

, какую базу данных вы используете –

+0

@ammoQ - MySQL, у меня есть? обновил вопрос. –

ответ

1

Использование SQL Server 2005+ можно использовать КТР

DECLARE @Start INT, @End INT 

SELECT @Start = 0, @End = 100000 

;WITH Numbers AS (
     SELECT @Start Num 
     UNION ALL 
     SELECT Num + 1 
     FROM Numbers 
     WHERE Num < @End 
) 
SELECT * 
FROM Numbers 
OPTION (MAXRECURSION 0); 
+0

Просто имейте в виду, что максимальное количество рекурсий по умолчанию равно 100. Это можно изменить до 32767, вызвав: option (maxrecursion 32767). см. http://msdn.microsoft.com/en-us/ library/ms175972.aspx – kristof

+0

Попробуйте этот запрос, он пройдет мимо 32767, как указано @End = 100000 –

+0

true, мой плохой как-то я не заметил, что когда OPTION (MAXRECURSION 0) указан, для рекурсий нет предела. Спасибо – kristof

2

Обычный способ сделать это в Oracle будет злоупотреблять RowNum псевдостолбец:

select rownum from all_objects where rownum<=100; 
1

PostgreSQL позволяет для использования:

select * from generate_series(2,4); 
generate_series 
----------------- 
       2 
       3 
       4 

Это специфично для механизма PostgresSQL. Но не обязательно записывать хранимую процедуру для вашей базы данных.

0

Почему не loop? как

BEGIN 
     DECLARE a INT Default 0 ; 
     simple_loop: LOOP 
     SET a=a+1; 
     insert into mytable(id) values(a); 
     IF a=1000 THEN 
      LEAVE simple_loop; 
     END IF; 
    END LOOP simple_loop; 

Измененный Mysql For Loop

пардон, если синтаксис не так, как я чистый SQL SERVER парень (:

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