Wie kann ich mit der Tabelle DUAL eine Liste mit Zahlen von 1 bis 100 erhalten?
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
Eine weitere interessante Lösung in Oracle PL/SQL:
SELECT LEVEL n
FROM DUAL
CONNECT BY LEVEL <= 100;
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
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 .
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
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;
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;
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.
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
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