SQL для генерации списка чисел от 1 до 100

Как использовать таблицу DUAL, как я могу получить список чисел от 1 до 100?

Ваш вопрос трудно понять, но если вы хотите выбрать числа от 1 до 100 , то это должно сделать трюк:

 Select Rownum r From dual Connect By Rownum <= 100 

Еще одно интересное решение в ORACLE PL / SQL:

  SELECT LEVEL n FROM DUAL CONNECT BY LEVEL <= 100; 

Сделайте это с трудом. Используйте удивительное предложение MODEL :

 SELECT V FROM DUAL MODEL DIMENSION BY (0 R) MEASURES (0 V) RULES ITERATE (100) ( V[ITERATION_NUMBER] = ITERATION_NUMBER + 1 ) ORDER BY 1 

Доказательство: http://sqlfiddle.com/#!4/d41d8/20837

Ответ Петра тоже мой любимый.

Если вы ищете более подробную информацию, здесь есть неплохой обзор, IMO.
Особенно интересно читать тесты .

Если вы хотите, чтобы ваши целые числа были связаны между двумя целыми числами (т.е. начинались с чего-то другого, кроме 1), вы можете использовать что-то вроде этого:

 with bnd as (select 4 lo, 9 hi from dual) select (select lo from bnd) - 1 + level r from dual connect by level <= (select hi-lo from bnd); 

Это дает:

 4 5 6 7 8 

Использование GROUP BY CUBE :

 SELECT ROWNUM FROM (SELECT 1 AS c FROM dual GROUP BY CUBE(1,1,1,1,1,1,1) ) sub WHERE ROWNUM <=100; 

Демо-версия реестров

Вариант примера Питера, демонстрирующий способ, который можно использовать для генерации всех чисел от 0 до 99.

 with digits as ( select mod(rownum,10) as num from dual connect by rownum <= 10 ) select a.num*10+b.num as num from digits a ,digits b order by num ; 

Что-то вроде этого становится полезным, когда вы выполняете назначение идентификатора партии и ищете элементы, которые еще не были назначены.

Например, если вы продаете билеты на бинго, вы можете назначить партии из 100 сотрудников (предположите, что я использовал для финансирования рейза для спорта). Когда они продают партию, им присваивается следующая партия в последовательности. Тем не менее, люди, покупающие билеты, могут выбрать покупку любых билетов из партии. Можно задать вопрос: «какие билеты были проданы».

В этом случае у нас есть только частичный, случайный список билетов, которые были возвращены в рамках данной партии, и требуют полного списка всех возможностей для определения того, чего у нас нет.

 with range as ( select mod(rownum,100) as num from dual connect by rownum <= 100 ), AllPossible as ( select a.num*100+b.num as TicketNum from batches a ,range b order by num ) select TicketNum as TicketsSold from AllPossible where AllPossible.Ticket not in (select TicketNum from TicketsReturned) ; 

Извините за использование ключевых слов, я изменил некоторые имена переменных из реального мира.

… Чтобы продемонстрировать, почему что-то подобное было бы полезно

Я создал функцию Oracle, которая возвращает таблицу чисел

 CREATE OR REPLACE FUNCTION [schema].FN_TABLE_NUMBERS( NUMINI INTEGER, NUMFIN INTEGER, EXPONENCIAL INTEGER DEFAULT 0 ) RETURN TBL_NUMBERS IS NUMEROS TBL_NUMBERS; INDICE NUMBER; BEGIN NUMEROS := TBL_NUMBERS(); FOR I IN ( WITH TABLA AS (SELECT NUMINI, NUMFIN FROM DUAL) SELECT NUMINI NUM FROM TABLA UNION ALL SELECT (SELECT NUMINI FROM TABLA) + (LEVEL*TO_NUMBER('1E'||TO_CHAR(EXPONENCIAL))) NUM FROM DUAL CONNECT BY (LEVEL*TO_NUMBER('1E'||TO_CHAR(EXPONENCIAL))) <= (SELECT NUMFIN-NUMINI FROM TABLA) ) LOOP NUMEROS.EXTEND; INDICE := NUMEROS.COUNT; NUMEROS(INDICE):= i.NUM; END LOOP; RETURN NUMEROS; EXCEPTION WHEN NO_DATA_FOUND THEN RETURN NUMEROS; WHEN OTHERS THEN RETURN NUMEROS; END; / 

Необходимо создать новый тип данных:

 CREATE OR REPLACE TYPE [schema]."TBL_NUMBERS" IS TABLE OF NUMBER; / 

Применение:

 SELECT COLUMN_VALUE NUM FROM TABLE([schema].FN_TABLE_NUMBERS(1,10))--integers difference: 1;2;.......;10 

И если вам нужны десятичные числа между числами с помощью экспоненциальной записи:

 SELECT COLUMN_VALUE NUM FROM TABLE([schema].FN_TABLE_NUMBERS(1,10,-1));--with 0.1 difference: 1;1.1;1.2;.......;10 SELECT COLUMN_VALUE NUM FROM TABLE([schema].FN_TABLE_NUMBERS(1,10,-2));--with 0.01 difference: 1;1.01;1.02;.......;10 

Вот забавный способ создания таблицы чисел. Он не использует таблицу DUAL, но если таблица DUAL когда-либо исчезнет, ​​это может быть резервным планом.

 DECLARE @TotalNumbers INT = 100; DECLARE @From DATETIME = CONVERT(DATETIME, CONVERT(DATE, GETDATE())), @To DATETIME = DATEADD(SECOND, @TotalNumbers - 1, CONVERT(DATETIME, CONVERT(DATE, GETDATE()))); WITH AlmostNumberTable (Hola) AS (SELECT @From UNION ALL SELECT DATEADD(SECOND, 1, Hola) FROM AlmostNumberTable WHERE Hola< @To ) SELECT [Number] FROM ( SELECT DATEPART(MINUTE, AlmostNumberTable.Hola) * 60 + DATEPART(SECOND, AlmostNumberTable.Hola) + 1 AS [Number] FROM AlmostNumberTable ) AS NumberTable; 

Это, наверное, вздор, но это рабочее решение, и было весело писать.

 SELECT * FROM `DUAL` WHERE id>0 AND id<101 

Вышеуказанный запрос написан в SQL в базе данных.

Не нужно забирать все умные для ничтожных 100 номеров, просто грубая сила;)

 select 1 from dual union select 2 from dual union select 3 from dual union select 4 from dual union select 5 from dual union select 6 from dual union select 7 from dual union select 8 from dual union select 9 from dual union select 10 from dual union select 11 from dual union select 12 from dual union select 13 from dual union select 14 from dual union select 15 from dual union select 16 from dual union select 17 from dual union select 18 from dual union select 19 from dual union select 20 from dual union select 21 from dual union select 22 from dual union select 23 from dual union select 24 from dual union select 25 from dual union select 26 from dual union select 27 from dual union select 28 from dual union select 29 from dual union select 30 from dual union select 31 from dual union select 32 from dual union select 33 from dual union select 34 from dual union select 35 from dual union select 36 from dual union select 37 from dual union select 38 from dual union select 39 from dual union select 40 from dual union select 41 from dual union select 42 from dual union select 43 from dual union select 44 from dual union select 45 from dual union select 46 from dual union select 47 from dual union select 48 from dual union select 49 from dual union select 50 from dual union select 51 from dual union select 52 from dual union select 53 from dual union select 54 from dual union select 55 from dual union select 56 from dual union select 57 from dual union select 58 from dual union select 59 from dual union select 60 from dual union select 61 from dual union select 62 from dual union select 63 from dual union select 64 from dual union select 65 from dual union select 66 from dual union select 67 from dual union select 68 from dual union select 69 from dual union select 70 from dual union select 71 from dual union select 72 from dual union select 73 from dual union select 74 from dual union select 75 from dual union select 76 from dual union select 77 from dual union select 78 from dual union select 79 from dual union select 80 from dual union select 81 from dual union select 82 from dual union select 83 from dual union select 84 from dual union select 85 from dual union select 86 from dual union select 87 from dual union select 88 from dual union select 89 from dual union select 90 from dual union select 91 from dual union select 92 from dual union select 93 from dual union select 94 from dual union select 95 from dual union select 96 from dual union select 97 from dual union select 98 from dual union select 99 from dual union select 100 from dual;