membuat angka tambahan dalam kueri sql oracle

13

bagaimana cara membuat angka tambahan dalam kueri 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
50LV3R
sumber

Jawaban:

14

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

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;
Alex Poole
sumber
1
saya pikir saya akan memilih yang ini untuk kode saya, ini jauh lebih sederhana daripada menggunakan Dengan klausa
50LV3R
16

Saya pikir ini akan berhasil (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.

Kerri Shotts
sumber
5

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).

Leigh Riffel
sumber
karya yang sedikit dimodifikasi di MS SQL juga WITH T3(Years) AS ( SELECT 2008 Years UNION ALL SELECT Years + 1 FROM T3 WHERE Years < 2011 ) SELECT * FROM T3;
miracle173
@ miracle173 Menarik, cukup hapus FROM dual.
Leigh Riffel
dualadalah tabel khusus oracle. Database lain seperti MS SQL Sever, mysql, postgres memungkinkan pernyataan seperti select expression. mysql juga tahu meja ganda
miracle173
4

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.

bernd_k
sumber
3
Sepertinya banyak overhead untuk sesuatu yang begitu sepele, dan DDL akan melakukan komit implisit yang mungkin tidak diharapkan. Dan pengguna yang mengeluarkan kueri mungkin tidak memiliki izin untuk membuat urutan.
Alex Poole
saya setuju dengan Alex Poole, tapi tetap saja, ini merupakan solusi lain terima kasih
50LV3R
-1 karena alasan @AlexPoole dinyatakan. jika Anda menjalankan kembali kueri tanpa membuat ulang urutan Anda mendapatkan hasil yang berbeda.
miracle173
kueri yang menggunakan urutan tidak mengembalikan set angka yang diinginkan.
miracle173
-1

Berikut adalah contoh menambahkan beberapa flag dan incrementing yang berdasarkan pada pernyataan kasus.

WITH T3(FLAG1,FLAG2,FLAG3,tt,OTHER_DATA)  
AS (    
SELECT '0' FLAG1, '0' FLAG2, '0' FLAG3 , current_timestamp  tt , 'dummy'  OTHER_DATA 
FROM dual 
UNION ALL  
SELECT case when cast( FLAG2 as int) > 5 then
cast ((cast(FLAG1 as int) + 1) as varchar2(30)) else  FLAG1 end FLAG1,
cast((cast(FLAG2 as int) + 1) as varchar2(30)) FLAG2  ,case when (
(FLAG2 ='3') or (FLAG2 = '4')) then cast ((cast(  FLAG3 as int) + 1)
as varchar2(30)) else FLAG3 end FLAG3  ,current_timestamp  tt ,
'ACTUAL' OTHER_DATA FROM T3 WHERE FLAG2 < 10   
)
SELECT * FROM T3
WHERE OTHER_DATA != 'dummy' ;

- Hasil yang ditetapkan di bawah ini

Flag1   Flag2   Flag3   TT                                              OTHER_DATA
0       1       0       21-DEC-15 08.31.05.229502000 PM ASIA/CALCUTTA   ACTUAL
0       2       0       21-DEC-15 08.31.05.229502000 PM ASIA/CALCUTTA   ACTUAL
0       3       0       21-DEC-15 08.31.05.229502000 PM ASIA/CALCUTTA   ACTUAL
0       4       1       21-DEC-15 08.31.05.229502000 PM ASIA/CALCUTTA   ACTUAL
0       5       2       21-DEC-15 08.31.05.229502000 PM ASIA/CALCUTTA   ACTUAL
0       6       2       21-DEC-15 08.31.05.229502000 PM ASIA/CALCUTTA   ACTUAL
1       7       2       21-DEC-15 08.31.05.229502000 PM ASIA/CALCUTTA   ACTUAL
2       8       2       21-DEC-15 08.31.05.229502000 PM ASIA/CALCUTTA   ACTUAL
3       9       2       21-DEC-15 08.31.05.229502000 PM ASIA/CALCUTTA   ACTUAL
4      10       2       21-DEC-15 08.31.05.229502000 PM ASIA/CALCUTTA   ACTUAL   
Suyaraj Mariappan
sumber
2
Mengapa semua casting antara string dan angka? Tidak sepenuhnya yakin apa ini menambah jawaban yang ada karena itu bukanlah sesuatu yang OP cari.
Alex Poole
-1

Tingkatkan hanya satu dengan rownum pilih rownum + 100 dari urutan "tabel" sebanyak 1;

Hasil itu dengan 101, 102 dll.

L.Luca
sumber