comment créer un nombre incrémentiel dans la requête SQL Oracle sans créer de table? J'ai essayé d'utiliser la clause "with", mais je n'ai pas réussi à obtenir le résultat attendu. J'utilise Oracle 10g
voici le code que j'essaye, il ne semble pas fonctionner:
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
le résultat attendu que je veux est:
2008
2009
2010
2011
Similaire à la réponse de Kerri, mais sans le with
(et inspiré par un réponse SO ):
SELECT 2007 + LEVEL AS YEARS
FROM DUAL
CONNECT BY LEVEL <= 4;
YEARS
----------
2008
2009
2010
2011
Ou si votre objectif est d'obtenir l'année en cours les trois précédentes, sans coder en dur l'année de début:
SELECT EXTRACT(YEAR FROM SYSDATE) + 1 - LEVEL AS YEARS
FROM DUAL
CONNECT BY LEVEL <= 4
ORDER BY YEARS;
Je pense cela fonctionnera (basé sur cette page ( http://psoug.org/definition/LEVEL.htm ) comme point de départ):
WITH counter
AS ( SELECT LEVEL seq
FROM DUAL
CONNECT BY LEVEL <= 4 )
SELECT (2008 + seq - 1) myYear
FROM counter
ORDER BY 1
;
Cela devrait retourner:
myYear
------
2008
2009
2010
2011
Ajustez 2008 et 4 pour obtenir des résultats différents.
Il semble que l'OP tentait de résoudre le problème à l'aide d'une sous-requête récursive. Cela ne fonctionnera pas dans 10g car cette fonctionnalité n'a pas été ajoutée avant 11.2, mais dans 11.2+, ce qui suit serait également une solution valide au problème.
WITH T3(Years) AS (
SELECT 2008 Years FROM dual
UNION ALL
SELECT Years + 1 FROM T3 WHERE Years < 2011
)
SELECT * FROM T3;
La seule chose qui manquait à la requête de l'OP était (YEARS)
.
Pourquoi ne pas simplement créer une séquence?
CREATE SEQUENCE TEMP_YEAR_sEQUENCE START WITH 2008;
SELECT TEMP_YEAR_sEQUENCE.NEXTVAL FROM DUAL;
....
DROP SEQUENCE TEMP_YEAR_SEQUENCE;
MODIFIER:
Pour de petites plages de valeurs de séquence, vous pouvez utiliser quelque chose comme ceci:
select ROWNUM + 10 # start value
from ALL_OBJECTS
where ROWNUM <= 5 ; # count of values
Vous avez juste besoin d'une table avec un nombre suffisant de lignes.