Подтвердить что ты не робот

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

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

4b9b3361

Ответ 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;