it-swarm.dev

utwórz liczbę przyrostową w zapytaniu Oracle SQL

jak utworzyć liczbę przyrostową w zapytaniu SQL sql bez tworzenia tabeli? Próbowałem użyć klauzuli „z”, ale nie udało mi się uzyskać oczekiwanego rezultatu. Używam Oracle 10g

oto kod, który próbuję, wydaje się nie działać:

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

oczekiwany wynik, który chcę:

2008
2009
2010
2011
13
50LV3R

Podobne do odpowiedzi Kerri, ale bez with (i zainspirowane odpowiedź SO ):

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

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

Lub jeśli Twoim celem jest zdobycie bieżącego roku trzygo poprzedzającego go, bez twardego kodowania roku początkowego:

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

Ja myślę , że to zadziała (na podstawie tej strony ( http://psoug.org/definition/LEVEL.htm ) jako punkt wyjścia):

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

To powinno zwrócić:

myYear
------
  2008
  2009
  2010
  2011

Dostosuj 2008 i 4, aby uzyskać różne wyniki.

16
Kerri Shotts

Wygląda na to, że OP próbował rozwiązać problem za pomocą rekurencyjnego podkwerendy. To nie zadziała w 10g, ponieważ ta funkcjonalność została dodana dopiero w wersji 11.2, ale w wersji 11.2+ następujące rozwiązanie byłoby również poprawnym rozwiązaniem problemu.

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

Jedyne, czego brakuje w zapytaniu PO, to (YEARS).

5
Leigh Riffel

Dlaczego nie stworzyć sekwencji?

CREATE SEQUENCE TEMP_YEAR_sEQUENCE START WITH 2008;

SELECT TEMP_YEAR_sEQUENCE.NEXTVAL FROM DUAL; 

....

DROP SEQUENCE TEMP_YEAR_SEQUENCE;

EDYCJA:

W przypadku małych zakresów wartości sekwencji można użyć czegoś takiego:

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

Potrzebujesz tylko tabeli z wystarczającą liczbą wierszy.

4
bernd_k