it-swarm-eu.dev

Erstellen Sie eine inkrementelle Nummer in der Oracle SQL-Abfrage

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
13
50LV3R

Ä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;
14
Alex Poole

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.

16
Kerri Shotts

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

5
Leigh Riffel

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.

4
bernd_k