it-swarm.it

creare un numero incrementale nella query sql Oracle

come creare un numero incrementale nella query SQL sql senza creare alcuna tabella? Ho provato a utilizzare la clausola "with", ma non sono riuscito a ottenere il risultato previsto. Sto usando Oracle 10g

ecco il codice che provo, sembra non funzionare:

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

il risultato atteso che desidero è:

2008
2009
2010
2011
13
50LV3R

Simile alla risposta di Kerri, ma senza with (e ispirato a SO answer ):

SELECT 2007 + LEVEL AS YEARS
FROM DUAL
CONNECT BY LEVEL <= 4;

     YEARS
----------
      2008
      2009
      2010
      2011

O se il tuo obiettivo è quello di ottenere l'anno in corso i tre precedenti, senza codificare l'anno di inizio:

SELECT EXTRACT(YEAR FROM SYSDATE) + 1 - LEVEL AS YEARS
FROM DUAL
CONNECT BY LEVEL <= 4
ORDER BY YEARS;
14
Alex Poole

Io penso che funzionerà (basato su questa pagina ( http://psoug.org/definition/LEVEL.htm ) come punto di partenza):

WITH counter
AS ( SELECT LEVEL seq
       FROM DUAL
     CONNECT BY LEVEL <= 4 )
SELECT (2008 + seq - 1) myYear
  FROM counter
 ORDER BY 1
;

Questo dovrebbe restituire:

myYear
------
  2008
  2009
  2010
  2011

Modifica 2008 e 4 per ottenere risultati diversi.

16
Kerri Shotts

Sembra che l'OP stesse tentando di risolvere il problema utilizzando una sottoquery ricorsiva. Questo non funzionerà in 10g perché quella funzionalità non è stata aggiunta fino all'11.2, ma in 11.2+ anche questa sarebbe una valida soluzione al problema.

WITH T3(Years) AS (
   SELECT 2008 Years FROM dual
   UNION ALL
   SELECT Years + 1 FROM T3 WHERE Years < 2011
   )
SELECT * FROM T3;

L'unica cosa che mancava nella query del PO era (YEARS).

5
Leigh Riffel

Perché non creare semplicemente una sequenza?

CREATE SEQUENCE TEMP_YEAR_sEQUENCE START WITH 2008;

SELECT TEMP_YEAR_sEQUENCE.NEXTVAL FROM DUAL; 

....

DROP SEQUENCE TEMP_YEAR_SEQUENCE;

EDIT:

Per piccoli intervalli di valori di sequenza puoi usare qualcosa del genere:

select ROWNUM + 10   # start value
from ALL_OBJECTS 
where ROWNUM <= 5 ;  # count of values 

Hai solo bisogno di una tabella con un numero sufficiente di righe.

4
bernd_k