it-swarm.asia

membuat nomor tambahan dalam kueri Oracle sql

bagaimana cara membuat angka tambahan dalam permintaan sql Oracle tanpa membuat tabel? Saya telah mencoba menggunakan klausa "dengan", tetapi saya gagal mendapatkan hasil yang diharapkan. Saya menggunakan Oracle 10g

di sini adalah kode yang saya coba, sepertinya tidak berfungsi:

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

hasil yang saya inginkan adalah:

2008
2009
2010
2011
13
50LV3R

Mirip dengan jawaban Kerri, tetapi tanpa with (dan terinspirasi oleh SO jawaban ):

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

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

Atau jika tujuan Anda adalah untuk mendapatkan tahun berjalan tiga tahun sebelumnya, tanpa meng-coding tahun awal:

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

Saya berpikir ini akan berfungsi (berdasarkan halaman ini ( http://psoug.org/definition/LEVEL.htm ) sebagai titik awal):

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

Ini akan kembali:

myYear
------
  2008
  2009
  2010
  2011

Sesuaikan 2008 dan 4 untuk mendapatkan hasil yang berbeda.

16
Kerri Shotts

Sepertinya OP berusaha memecahkan masalah menggunakan subquery rekursif. Ini tidak akan berfungsi dalam 10g karena fungsi itu tidak ditambahkan hingga 11.2, tetapi dalam 11.2+ berikut ini juga akan menjadi solusi yang valid untuk masalah tersebut.

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

Satu-satunya hal yang hilang dari permintaan OP adalah (YEARS).

5
Leigh Riffel

Mengapa tidak membuat urutan saja?

CREATE SEQUENCE TEMP_YEAR_sEQUENCE START WITH 2008;

SELECT TEMP_YEAR_sEQUENCE.NEXTVAL FROM DUAL; 

....

DROP SEQUENCE TEMP_YEAR_SEQUENCE;

EDIT:

Untuk rentang kecil dari nilai urutan Anda dapat menggunakan sesuatu seperti ini:

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

Anda hanya perlu tabel dengan jumlah baris yang cukup.

4
bernd_k