Используя таблицу DUAL, как я могу получить список чисел от 1 до 100?
SQL для генерации списка чисел от 1 до 100
Ответ 1
Трудно понять ваш вопрос, но если вы хотите выбрать числа от 1
до 100
, то это должно сделать трюк:
Select Rownum r
From dual
Connect By Rownum <= 100
Ответ 2
Еще одно интересное решение в ORACLE PL/SQL:
SELECT LEVEL n
FROM DUAL
CONNECT BY LEVEL <= 100;
Ответ 3
Сделайте это с трудом. Используйте удивительное предложение 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
Ответ 4
Питер тоже мой любимый.
Если вы ищете более подробную информацию, здесь есть неплохой обзор, IMO, здесь.
Особенно интересно прочитать теги .
Ответ 5
Если вы хотите, чтобы ваши целые числа были связаны между двумя целыми числами (то есть начинались с чего-то другого, кроме 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
Ответ 6
Использование 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;
Ответ 7
Вариант примера Питера, демонстрирующий способ, который можно использовать для генерации всех чисел между 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)
;
Извините за использование ключевых слов, я изменил некоторые имена переменных из примера реального мира.
... Чтобы продемонстрировать, почему что-то подобное было бы полезно
Ответ 8
Я создал функцию 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
Ответ 9
Вот забавный способ создания таблицы чисел. Он не использует таблицу 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;
Это, наверное, вздор, но это рабочее решение, и было весело писать.
Ответ 10
SELECT * FROM `DUAL` WHERE id>0 AND id<101
Вышеприведенный запрос написан в SQL в базе данных.
Ответ 11
Не нужно забирать все умные за 100 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;