wie erstelle ich eine inkrementelle Nummer in einer Oracle SQL-Abfrage, ohne eine Tabelle zu erstellen? Ich habe versucht, die Klausel "with" zu verwenden, aber das erwartete Ergebnis konnte nicht erzielt werden. Ich benutze Oracle 10g
hier ist der Code, den ich versuche, es scheint nicht zu funktionieren:
WITH
TABLE3 AS ( SELECT 2008 YEARS FROM dual WHERE 1=1
union all
select t3.YEARS+1 from TABLE3 t3
WHERE 1=1 AND t3.YEARS < 2011
)
select YEARS from TABLE3
das erwartete Ergebnis, das ich möchte, ist:
2008
2009
2010
2011
Ähnlich wie Kerris Antwort, jedoch ohne with
(und inspiriert von einer SO-Antwort ):
SELECT 2007 + LEVEL AS YEARS
FROM DUAL
CONNECT BY LEVEL <= 4;
YEARS
----------
2008
2009
2010
2011
Oder wenn es Ihr Ziel ist, das aktuelle Jahr auf die drei vorhergehenden zu bringen, ohne das Startjahr fest zu codieren:
SELECT EXTRACT(YEAR FROM SYSDATE) + 1 - LEVEL AS YEARS
FROM DUAL
CONNECT BY LEVEL <= 4
ORDER BY YEARS;
Ich denke dies wird funktionieren (basierend auf dieser Seite ( http://psoug.org/definition/LEVEL.htm ) als Ausgangspunkt):
WITH counter
AS ( SELECT LEVEL seq
FROM DUAL
CONNECT BY LEVEL <= 4 )
SELECT (2008 + seq - 1) myYear
FROM counter
ORDER BY 1
;
Dies sollte zurückkehren:
myYear
------
2008
2009
2010
2011
Passen Sie 2008 und 4 an, um unterschiedliche Ergebnisse zu erhalten.
Es sieht so aus, als hätte das OP versucht, das Problem mithilfe einer rekursiven Unterabfrage zu lösen. Dies funktioniert in 10g nicht, da diese Funktionalität erst in 11.2 hinzugefügt wurde, aber in 11.2+ wäre das Folgende auch eine gültige Lösung für das Problem.
WITH T3(Years) AS (
SELECT 2008 Years FROM dual
UNION ALL
SELECT Years + 1 FROM T3 WHERE Years < 2011
)
SELECT * FROM T3;
Das einzige, was in der OP-Abfrage fehlte, war (YEARS)
.
Warum nicht einfach eine Sequenz erstellen?
CREATE SEQUENCE TEMP_YEAR_sEQUENCE START WITH 2008;
SELECT TEMP_YEAR_sEQUENCE.NEXTVAL FROM DUAL;
....
DROP SEQUENCE TEMP_YEAR_SEQUENCE;
EDIT :
Für kleine Bereiche von Sequenzwerten können Sie Folgendes verwenden:
select ROWNUM + 10 # start value
from ALL_OBJECTS
where ROWNUM <= 5 ; # count of values
Sie benötigen lediglich eine Tabelle mit einer ausreichenden Anzahl von Zeilen.