it-swarm-eu.dev

vytvořit přírůstkové číslo v dotazu Oracle sql

jak vytvořit přírůstkové číslo v dotazu Oracle sql bez vytvoření jakékoli tabulky? Zkusil jsem použít klauzuli „s“, ale nepodařilo se mi získat očekávaný výsledek. Používám Oracle 10g

zde je kód, který se snažím, zdá se, že nefunguje:

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

očekávaný výsledek, který chci, je:

2008
2009
2010
2011
13
50LV3R

Podobná Kerriho odpovědi, ale bez with (a inspirovaná SO odpověď ):

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

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

Nebo pokud je vaším cílem dostat aktuální rok předcházející, bez pevného kódování začátku roku:

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

I myslím to bude fungovat (na základě této stránky ( http://psoug.org/definition/LEVEL.htm ) jako výchozí bod):

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

To by mělo vrátit:

myYear
------
  2008
  2009
  2010
  2011

Upravte 2008 a 4 a získejte různé výsledky.

16
Kerri Shotts

Vypadá to, že se OP pokoušel vyřešit problém pomocí rekurzivního poddotazu. Toto nebude fungovat v 10 g, protože tato funkce nebyla přidána až do 11.2, ale v 11.2+ by následující řešení bylo také platným řešením problému.

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

Jediné, co v dotazu OP chybělo, bylo (YEARS).

5
Leigh Riffel

Proč nejen vytvořit sekvenci?

CREATE SEQUENCE TEMP_YEAR_sEQUENCE START WITH 2008;

SELECT TEMP_YEAR_sEQUENCE.NEXTVAL FROM DUAL; 

....

DROP SEQUENCE TEMP_YEAR_SEQUENCE;

ÚPRAVA:

Pro malé rozsahy hodnot sekvencí můžete použít něco takového:

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

Potřebujete pouze tabulku s dostatečným počtem řádků.

4
bernd_k