it-swarm.com.de

SQL zum Generieren einer Liste mit Zahlen von 1 bis 100

Wie kann ich mit der Tabelle DUAL eine Liste mit Zahlen von 1 bis 100 erhalten?

40

Ihre Frage ist schwer zu verstehen, aber wenn Sie die Zahlen von 1 bis 100 auswählen möchten, sollten Sie Folgendes tun:

Select Rownum r
From dual
Connect By Rownum <= 100
67
Peter Lang

Eine weitere interessante Lösung in Oracle PL/SQL:

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

Mach es auf die harte Tour. Verwenden Sie die awesome MODEL-Klausel:

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

Beweis: http://sqlfiddle.com/#!4/d41d8/20837

12
Lukas Eder

Peters Antwort ist auch mein Favorit.

Wenn Sie nach mehr Details suchen, gibt es eine recht gute Übersicht, IMO, hier .
Besonders interessant ist das Lesen der Benchmarks .

7
Unreason

Wenn Sie möchten, dass Ihre Ganzzahlen zwischen zwei Ganzzahlen gebunden werden (d. H. Mit etwas anderem als 1 beginnen), können Sie Folgendes verwenden:

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);

Es gibt:

4
5
6
7
8
5
vadipp

Mit der Oracle-Abfrageklausel: "WITH" können Sie Zahlen von 1 bis 100 auswählen:

WITH t(n) AS (
  SELECT 1 from dual
  UNION ALL
    SELECT n+1 FROM t WHERE n < 100
)
SELECT * FROM t;
2
echo

Sie könnten XMLTABLE verwenden:

SELECT rownum
FROM XMLTABLE('1 to 100');

DBFiddle Demo

2
Lukasz Szozda

GROUP BY CUBE verwenden:

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

Rextester Demo

1
Lukasz Szozda

Hier ist eine lustige Möglichkeit, eine Zahlentabelle zu generieren. Es verwendet nicht die DUAL-Tabelle, aber sollte die DUAL-Tabelle jemals verschwinden, könnte dies ein Backup-Plan sein.

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;

Es ist wahrscheinlich Unsinn, aber es ist eine funktionierende Lösung und es hat Spaß gemacht, zu schreiben.

0

Eine Variante von Peters Beispiel, die zeigt, wie auf diese Weise alle Zahlen zwischen 0 und 99 generiert werden können.

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
;

Etwas Ähnliches ist hilfreich, wenn Sie die Zuordnung von Stapelkennungen vornehmen und nach den Artikeln suchen, die noch nicht zugewiesen wurden.

Wenn Sie zum Beispiel Bingo-Tickets verkaufen, möchten Sie vielleicht Chargen von 100 Stockwerkspersonal zuweisen (raten Sie mir, wie ich früher die Spendenerhöhung für den Sport finanziert habe). Beim Verkauf einer Charge erhalten sie die nächste Charge nacheinander. Personen, die die Tickets kaufen, können jedoch auswählen, ob sie Tickets aus dem Stapel kaufen möchten. Es kann die Frage gestellt werden, "welche Tickets verkauft wurden". 

In diesem Fall haben wir nur eine unvollständige, zufällige Liste von Tickets, die innerhalb des angegebenen Batches zurückgegeben wurden, und benötigen eine vollständige Liste aller Möglichkeiten, um festzustellen, welche nicht vorhanden sind.

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)
;

Entschuldigen Sie die Verwendung von Schlüsselwörtern. Ich habe einige Variablennamen aus einem realen Beispiel geändert.

... um zu zeigen, warum so etwas nützlich ist

0
Jefferey Cave

Ich habe eine Oracle-Funktion erstellt, die eine Tabelle mit Zahlen zurückgibt

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;
/

Muss einen neuen Datentyp anlegen:

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

Verwendungszweck:

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

Und wenn Sie Dezimalzahlen zwischen Zahlen in exponentieller Notation benötigen:

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
0